home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 128 < prev    next >
Text File  |  1995-12-19  |  129KB  |  3,554 lines

  1. C.S.M.P. Digest             Tue, 19 Dec 95       Volume 3 : Issue 128
  2.  
  3. Today's Topics:
  4.  
  5.         Apple Multiple Scan Color Modes
  6.         Best Installer package for freeware software
  7.         Detecting color video
  8.         Doubles Vs BlockMove
  9.         Hiding the menu bar
  10.         MoveControl and popup menus
  11.         Non-resource custom PowerPC LDEF
  12.         OpenDoc lingo
  13.         Palettes and QuickTime
  14.         Passing a member function to DeviceLoop?
  15.         Question: Do you need to lock a Sound Handle before SndPlay
  16.         What's in a stack frame?
  17.         [Q] OpenTransport Introduction?
  18.         [Q] Using Update Events
  19.  
  20.  
  21.  
  22. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  23. (pottier@clipper.ens.fr).
  24.  
  25. The digest is a collection of article threads from the internet
  26. newsgroups comp.sys.mac.programmer.help, csmp.tools, csmp.misc and
  27. csmp.games. It is designed for people who read news semi-regularly and
  28. want an archive of the discussions.  If you don't know what a
  29. newsgroup is, you probably don't have access to it. Ask your systems
  30. administrator(s) for details. If you don't have access to news, you
  31. may still be able to post messages to the group by using a mail server
  32. like anon.penet.fi (mail help@anon.penet.fi for more information).
  33.  
  34. Each issue of the digest contains one or more sets of articles (called
  35. threads), with each set corresponding to a 'discussion' of a particular
  36. subject.  The articles are not edited; all articles included in this digest
  37. are in their original posted form (as received by our news server at
  38. nef.ens.fr).  Article threads are not added to the digest until the last
  39. article added to the thread is at least two weeks old (this is to ensure that
  40. the thread is dead before adding it to the digest).  Article threads that
  41. consist of only one message are generally not included in the digest.
  42.  
  43. The digest is officially distributed by two means, by email and ftp.
  44.  
  45. If you want to receive the digest by mail, send email to listserv@ens.fr
  46. with no subject and one of the following commands as body:
  47.     help                                Sends you a summary of commands
  48.     subscribe csmp-digest Your Name     Adds you to the mailing list
  49.     signoff csmp-digest                 Removes you from the list
  50. Once you have subscribed, you will automatically receive each new
  51. issue as it is created.
  52.  
  53. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  54. Questions related to the ftp site should be directed to
  55. scott.silver@dartmouth.edu.
  56.  
  57. -------------------------------------------------------
  58.  
  59. >From donut@natasha.nmt.edu (Matthew Channon)
  60. Subject: Apple Multiple Scan Color Modes
  61. Date: 27 Nov 1995 20:15:42 GMT
  62. Organization: New Mexico Tech
  63.  
  64. Changing depths on Apple's newer monitors is a necessity.
  65.  
  66. Sometimes you want 1024x768 at 8-bit for more screen real estate,
  67. and other times you want 640x480 at 24-bit for good color editing.
  68.  
  69. System 7's monitors control panels makes this possible, but it's a truly
  70. cumbersome process.
  71.  
  72. First you have to open monitors, click options, click on the depth you want,
  73. click okay, and close monitors.  Although it's not that difficult, it can
  74. be quite time-consuming.
  75.  
  76. I'm trying to write an extension, control panel, or FKEY that takes care of
  77. this process at the mere touch of a button, much like DepthCharge or
  78. Switcheroo does with color depths.
  79. Apple has not as of yet (at least to my knowledge) documented how this
  80. process takes place or can be called.
  81.  
  82. Does anyone out there have an idea how this could be accomplished?
  83. (A snippet of applicable code from the monitors control panel would be
  84. appreciated as my new mac has no <expletive omitted> interrupt key.
  85.  
  86. Thanks,
  87.  
  88. Matt Channon
  89. Materials Engineering Student (Mac enthusiast)
  90. New Mexico Institute of Mining and Technology
  91.  
  92. +++++++++++++++++++++++++++
  93.  
  94. >From Matt Slot <fprefect@umich.edu>
  95. Date: 28 Nov 1995 16:18:34 GMT
  96. Organization: University of Michigan
  97.  
  98. Matthew Channon, donut@natasha.nmt.edu writes:
  99.  > I'm trying to write an extension, control panel, or FKEY that takes care of
  100.  > this process at the mere touch of a button, much like DepthCharge or
  101.  > Switcheroo does with color depths.
  102.  
  103. Check out the "Monitor's FKEY", which is available at Sumex
  104. (I don't have the path, its an odd one) and from my Homepage
  105. <http://www.sils.umich.edu/~fprefect/>
  106.  
  107. It does what you are looking for, and I am working on an
  108. improved version that handles multiple monitors and actually
  109. cleans up the desktop icons after a switch.
  110.  
  111.  
  112.  > Apple has not as of yet (at least to my knowledge) documented how this
  113.  > process takes place or can be called.
  114.  
  115. If you still want to find out about Monitor Modes (and it *is*
  116. a nasty subject), check out the Slot Manager, (Nubus) Cards and
  117. Drivers, PCI Cards and Drivers, *and* the recent Display Manager
  118. documents. My code is pretty nasty, so I don't think I will post
  119. it to the public.
  120.  
  121. ---------------------------
  122.  
  123. >From jflet@dir.mcc.ac.uk (Julian Fletcher)
  124. Subject: Best Installer package for freeware software
  125. Date: Wed, 29 Nov 1995 16:52:12 +0000
  126. Organization: University Of Manchester, UK
  127.  
  128. Most commercial installer packages, e.g. 'smaller installer' are relatively
  129. expensive and appear to make no concessions for freeware software.
  130. I'm looking for an installer package that can support files strewn over
  131. multiple disks and which handle the installation process in a user
  132. friendly way. The projects that am working on are freeware in nature
  133. so I am not keen on spending vast amounts of money on licensing
  134. fees. 
  135.  
  136. Any suggestions anyone ?
  137.  
  138. (Replies via email appreciated)
  139.  
  140. Julian
  141. jflet@dir.mcc.ac.uk
  142.  
  143. +++++++++++++++++++++++++++
  144.  
  145. >From rmckay@chat.carleton.ca (Reevan McKay)
  146. Date: Fri, 1 Dec 1995 18:49:55 GMT
  147. Organization: Carleton University
  148.  
  149. Julian Fletcher (jflet@dir.mcc.ac.uk) wrote:
  150. > Most commercial installer packages, e.g. 'smaller installer' are relatively
  151. > expensive and appear to make no concessions for freeware software.
  152. > I'm looking for an installer package that can support files strewn over
  153. > multiple disks and which handle the installation process in a user
  154. > friendly way. The projects that am working on are freeware in nature
  155. > so I am not keen on spending vast amounts of money on licensing
  156. > fees. 
  157.  
  158. How about CompactPro self-extracting, segmented archives?  It will
  159. prompt the user to find each file when it needs it, and gets fairly decent
  160. compression rates.  To register it costs $25 I think, but you can probably
  161. even get away without registering it.  You can find it just about
  162. anywhere, but I'm sure it's on info-mac in the utilities or compression
  163. directories.
  164.  
  165. It isn't a true INSTALLER (i.e. it can't adjust the installation for a
  166. particular system configuration) but it will allow you to get the large
  167. files onto disks and onto the HD's of your users.
  168.  
  169. Stuffit doesn't seem to support .SEA segmented files for some reason.
  170.  
  171.  
  172. - --------------------------------------------------------------------
  173. Mikado
  174. Second Year Architecture
  175. Carleton University
  176.  
  177. "Jesus was an architect, previous to his career as a prophet."
  178.  
  179. Email address: rmckay@chat.carleton.ca
  180. - --------------------------------------------------------------------
  181.  
  182. +++++++++++++++++++++++++++
  183.  
  184. >From steve@mindvision.com (Steve Kiene)
  185. Date: Fri, 01 Dec 1995 14:29:25 -0700
  186. Organization: MindVision Software
  187.  
  188. In article <jflet-2911951652120001@etch2.ch.man.ac.uk>,
  189. jflet@dir.mcc.ac.uk (Julian Fletcher) wrote:
  190.  
  191. > Most commercial installer packages, e.g. 'smaller installer' are relatively
  192. > expensive and appear to make no concessions for freeware software.
  193. > I'm looking for an installer package that can support files strewn over
  194. > multiple disks and which handle the installation process in a user
  195. > friendly way. The projects that am working on are freeware in nature
  196. > so I am not keen on spending vast amounts of money on licensing
  197. > fees. 
  198.  
  199. Developer VISE Lite from MindVision Software is _free_ to
  200. shareware/freeware developers. Just send me e-mail for more info.
  201.  
  202. Steve Kiene
  203. MindVision Software
  204.  
  205. +++++++++++++++++++++++++++
  206.  
  207. >From bc@wetware.com (bill coderre)
  208. Date: Fri, 01 Dec 1995 16:15:00 -0800
  209. Organization: GRAFIX::CODERRE
  210.  
  211. In article <jflet-2911951652120001@etch2.ch.man.ac.uk>,
  212. jflet@dir.mcc.ac.uk (Julian Fletcher) wrote:
  213.  
  214. | Most commercial installer packages, e.g. 'smaller installer' are relatively
  215. | expensive and appear to make no concessions for freeware software.
  216. | I'm looking for an installer package that can support files strewn over
  217. | multiple disks and which handle the installation process in a user
  218. | friendly way. The projects that am working on are freeware in nature
  219. | so I am not keen on spending vast amounts of money on licensing
  220. | fees. 
  221.  
  222. If you are just installing a bunch of files into a folder, it's hard to
  223. beat Stuffit Installer Maker or DeveloperVISE. Both offer cheap shareware
  224. rates.
  225.  
  226. The Apple Installer is better for installing extensions, fonts, etc.
  227.  
  228. If you have Apple Installer questions, feel free to contact me, and I'll
  229. try to answer them.
  230.  
  231. bill coderre
  232. Apple Installer Guy
  233.  
  234. ---------------------------
  235.  
  236. >From iamandy@aol.com (IAmAndy)
  237. Subject: Detecting color video
  238. Date: 2 Dec 1995 20:19:53 -0500
  239. Organization: America Online, Inc. (1-800-827-6364)
  240.  
  241. Subj: MAC System 7 or later, C Programming, Detecting Color
  242.  
  243. How do you detect if a computer supports color?  Is there a quick draw or
  244. gestalt command?
  245.  
  246. I know how to detect if color quick draw is present, but I can't find a
  247. test for if the display is in color or black and white mode.
  248.  
  249. SysEnvirons( curSysEnvVers, &theWorld ) ;
  250. if( theWorld.hasColorQD == true )
  251.         SupportsColorDraw = true ;
  252.  
  253. Any help or references would be appreciated.
  254.  
  255. Andy.
  256.  
  257. +++++++++++++++++++++++++++
  258.  
  259. >From Edward de Jong <edward@magicmouse.com>
  260. Date: 3 Dec 1995 19:55:48 GMT
  261. Organization: magic mouse productions
  262.  
  263. You can certainly determine what mode a particular device is in.  Now 
  264. most people forget that the Macintosh supports up to 5 simultaneous 
  265. monitors, each of which can have different capabilities and sizes.  I 
  266. selected the Mac to develop on for this very reason, as I am trying to 
  267. preserve my eyesight by typing and editing on the grayscale monitor, and 
  268. watching my color program execute on the other monitor.  Anyway, you can 
  269. search though the devicelist, and find screen devices, and for each 
  270. device interrogate that device as to its current mode, and what modes it 
  271. is capable of getting into.  My product, Flying Colors, looks for the 
  272. largest color monitor around to determine which monitor to run on.  You 
  273. can't move the menu bar over, but it is a great convenience on multiple 
  274. monitor systems if the programs are smart enough to detect this.
  275.  
  276.  
  277.  
  278. +++++++++++++++++++++++++++
  279.  
  280. >From kaos@dircon.co.uk (Kaos)
  281. Date: 5 Dec 1995 04:27:42 GMT
  282. Organization: The Network
  283.  
  284. In article <49qtvp$8h@newsbf02.news.aol.com>, iamandy@aol.com (IAmAndy)
  285. wrote:
  286.  
  287. > Subj: MAC System 7 or later, C Programming, Detecting Color
  288. > How do you detect if a computer supports color?  Is there a quick draw or
  289. > gestalt command?
  290. > I know how to detect if color quick draw is present, but I can't find a
  291. > test for if the display is in color or black and white mode.
  292. > SysEnvirons( curSysEnvVers, &theWorld ) ;
  293. > if( theWorld.hasColorQD == true )
  294. >       SupportsColorDraw = true ;
  295. > Any help or references would be appreciated.
  296. > Andy.
  297.  
  298.  
  299. This snippet will get the current screendepth:
  300.                 GDHandle                tempGDH;
  301.                 short                   theDepth;
  302.                 tempGDH = GetGDevice();
  303.                 theDepth = (*(*tempGDH)->gdPMap)->pixelSize;
  304.  
  305. You can then call HasDepth to see if the monitor supports the colour depth
  306. you require, if it supports it call SetDepth to change it. If you need the
  307. code to do this , then:
  308.  
  309.  
  310.  
  311. short   someResult;             //result from depth change (if zero then it was done
  312. okay)
  313. short   hasMode;                //result from depth check (if non zero then it supports
  314. this depth)
  315. short   newdepth;               //the var. for the depth
  316. short   whichflags;             //the var. for which bits are significant
  317. short   newflags;               //the var. set to 1 colour or 0 for mono)
  318. GDHandle        myGDevice;      
  319.  
  320.         myGDevice=GetGDevice ();        //get the current screen 
  321.         whichflags=1;                           //set up to change the depth and colour mode only
  322.         newflags=1;                                     //this version supports colour only! (except depth 1 of
  323. course!)
  324.         newdepth=32;                            //millions, use16 for thousands, 8 for 256 etc.
  325.         hasMode = HasDepth(myGDevice,newdepth,whichflags,newflags); //check to see
  326. if the device supports the selection
  327.         if (hasMode)  { //if it supports the depth then do it
  328.         someResult = SetDepth(myGDevice,newdepth,whichflags,newflags);  //Try and
  329. set the depth, should always work as we've tested it with hasdepth!!
  330.                                         
  331.  
  332. add your own error handling etc.
  333.  
  334. Hope that helps a little
  335.  
  336. Dave
  337.  
  338. Struggling developer trying (usually in vain) to  advance his programming
  339. skills.
  340. Code Warrior Gold addict and general bum!
  341.  
  342. "Just another lost sock in the tumble dryer of life"
  343.  
  344. ---------------------------
  345.  
  346. >From erichsen@pacificnet.net (Erichsen)
  347. Subject: Doubles Vs BlockMove
  348. Date: 16 Nov 1995 02:22:08 GMT
  349. Organization: Disorganized
  350.  
  351. I did some tests (modifying the code in MoveData app from Tricks of the
  352. Mac Game Programming Gurus) between using doubles in a loop and BlockMove
  353. in a loop and BlockMove still blew it away (200 ticks vs 146 ticks for
  354. BlockMove) so why don't more people use BlockMove?
  355.  
  356. I compared BlockMove vs BlockMoveData and found no difference at all (both
  357. 146 ticks). Does BlockMove not flush the cache on a 6100?
  358.  
  359. One of the replies to my previous question of why people don't just use
  360. BlockMove instead of a copying loop was that the data is not necessarily a
  361. block but, all the examples of blitters I've seen just copy one contiguous
  362. block of memory to another contiguous block of memory. Why couldn't
  363. BlockMove be used?
  364.  
  365. +++++++++++++++++++++++++++
  366.  
  367. >From cameron_esfahani@powertalk.apple.com (Cameron Esfahani)
  368. Date: Mon, 20 Nov 1995 11:55:46 -0800
  369. Organization: Apple Computer, Inc.
  370.  
  371. BlockMove/BlockMoveData on the first generation PPC are exactly the same
  372. function.  The reason that BlockMoveData was created in the first place
  373. was you could tell the system you were not moving code around and to not
  374. flush the instructino cache.  Since the 601 has a unified cache, this
  375. means that you don't have to worry about cache-coherency.  This means you
  376. don't have to flush the processor cache.
  377.  
  378. The reason most people don't use BlockMove/BlockMoveData as a blitter is
  379. that it will be very very slow if you ever use the screen as the
  380. destination.  The reason is that the BlockMove/BlockMoveData routines use
  381. the PPC instruction DCBZ.  This instruction will cause a data-exception
  382. fault if the address supplied is not copy-back cacheable.  The screen
  383. isn't marked copy-back cacheable.
  384.  
  385. Hope this helps,
  386. Cameron Esfahani
  387.  
  388. +++++++++++++++++++++++++++
  389.  
  390. >From nporcino@sol.uvic.ca (Nick Porcino)
  391. Date: 20 Nov 1995 20:35:30 GMT
  392. Organization: Planet IX
  393.  
  394. In article <erichsen-1511951722510001@pm2-3.pacificnet.net>,
  395. erichsen@pacificnet.net (Erichsen) wrote:
  396.  
  397. >I did some tests (modifying the code in MoveData app from Tricks of the
  398. >Mac Game Programming Gurus) between using doubles in a loop and BlockMove
  399. >in a loop and BlockMove still blew it away (200 ticks vs 146 ticks for
  400. >BlockMove) so why don't more people use BlockMove?
  401. >
  402. >I compared BlockMove vs BlockMoveData and found no difference at all (both
  403. >146 ticks). Does BlockMove not flush the cache on a 6100?
  404. >
  405. >One of the replies to my previous question of why people don't just use
  406. >BlockMove instead of a copying loop was that the data is not necessarily a
  407. >block but, all the examples of blitters I've seen just copy one contiguous
  408. >block of memory to another contiguous block of memory. Why couldn't
  409. >BlockMove be used?
  410.  
  411. We did some tests and found on a Q700 that BlockMoveData was faster than
  412. BlockMove in the context of an actual game (Riddle of Master Lu)
  413.  
  414. - Nick Porcino
  415. Lead Engine Guy
  416. Sanctuary Woods
  417.  
  418. +++++++++++++++++++++++++++
  419.  
  420. >From meggs@virginia.edu (Andrew Meggs)
  421. Date: Tue, 21 Nov 1995 02:55:08 GMT
  422. Organization: University of Virginia
  423.  
  424. In article <erichsen-1511951722510001@pm2-3.pacificnet.net>,
  425. erichsen@pacificnet.net (Erichsen) wrote:
  426.  
  427. > I did some tests (modifying the code in MoveData app from Tricks of the
  428. > Mac Game Programming Gurus) between using doubles in a loop and BlockMove
  429. > in a loop and BlockMove still blew it away (200 ticks vs 146 ticks for
  430. > BlockMove) so why don't more people use BlockMove?
  431.  
  432. This got me interested, so I went and disassembled BlockMove. Surprisingly,
  433. they aren't using doubles:
  434.  
  435.   BlockMove
  436.      +00060 40A1C558   lwz        r5,0x0000(r3) 
  437.      +00064 40A1C55C   lwz        r6,0x0004(r3)
  438.      +00068 40A1C560   lwz        r7,0x0008(r3)
  439.      +0006C 40A1C564   lwz        r8,0x000C(r3)
  440.      +00070 40A1C568   lwz        r9,0x0010(r3) 
  441.      +00074 40A1C56C   lwz        r10,0x0014(r3)
  442.      +00078 40A1C570   lwz        r11,0x0018(r3)
  443.      +0007C 40A1C574   lwz        r12,0x001C(r3)
  444.      +00080 40A1C578   dcbz       0,r4          
  445.      +00084 40A1C57C   addi       r3,r3,0x0020  
  446.      +00088 40A1C580   dcbt       0,r3          
  447.      +0008C 40A1C584   stw        r5,0x0000(r4) 
  448.      +00090 40A1C588   stw        r6,0x0004(r4) 
  449.      +00094 40A1C58C   stw        r7,0x0008(r4)
  450.      +00098 40A1C590   stw        r8,0x000C(r4) 
  451.      +0009C 40A1C594   stw        r9,0x0010(r4)
  452.      +000A0 40A1C598   stw        r10,0x0014(r4)
  453.      +000A4 40A1C59C   stw        r11,0x0018(r4) 
  454.      +000A8 40A1C5A0   stw        r12,0x001C(r4) 
  455.      +000AC 40A1C5A4   addi       r4,r4,0x0020  
  456.      +000B0 40A1C5A8   bdnz       BlockMove+00060
  457.  
  458.  
  459. The performance win is in the dcbz/dcbt pair. I'm assuming you weren't
  460. copying to video memory, because that's marked uncacheable, and dcbz will
  461. severely hurt performance if your destination is uncacheable.
  462.  
  463. I probably would have written it more like this, personally. Does anyone
  464. have any idea what makes Apple's better? (Assuming it is...)
  465.  
  466. ;assume source, destination, and size are all 32-byte aligned
  467. ;set r3 to source address minus 8 and r4 to destination address minus 8
  468. ;set ctr to size >> 5
  469.  
  470. BlockMoveLoop
  471.    lfd      fp0,8(r3)
  472.    lfd      fp1,16(r3)
  473.    lfd      fp2,24(r3)
  474.    lfdu     fp3,32(r3)
  475.    dcbz     0,r4
  476.    dcbt     0,r3
  477.    stfd     fp0,8(r4)
  478.    stfd     fp1,16(r4)
  479.    stfd     fp2,24(r4)
  480.    stfdu    fp3,32(r4)
  481.    bdnz     BlockMoveLoop
  482.  
  483. > I compared BlockMove vs BlockMoveData and found no difference at all (both
  484. > 146 ticks). Does BlockMove not flush the cache on a 6100?
  485.  
  486. The unified instruction and data cache on the 601 wouldn't cause any
  487. problems with treating code as data, so there's no need to maintain
  488. coherency between the two. In other words, it shouldn't, but on the
  489. 604 it would need to.
  490.  
  491. -- 
  492. _________________________________________________________________________
  493. andrew meggs                               the one who dies with the most
  494. meggs@virginia.edu                              AOL free trial disks wins
  495. _________________________________________________________________________
  496. dead tv software --==-- the next generation of 3D games for the macintosh
  497.        <http://darwin.clas.virginia.edu/~apm3g/deadtv/index.html>
  498.  
  499. +++++++++++++++++++++++++++
  500.  
  501. >From mass@mail.island.net (Tom Stromar)
  502. Date: 21 Nov 1995 05:52:12 GMT
  503. Organization: Island Internet Customer
  504.  
  505. >>I did some tests (modifying the code in MoveData app from Tricks of the
  506. >>Mac Game Programming Gurus) between using doubles in a loop and BlockMove
  507. >>in a loop and BlockMove still blew it away (200 ticks vs 146 ticks for
  508. >>BlockMove) so why don't more people use BlockMove?
  509.  
  510. Hmmm, I thought I read somewhere that blockmove was only available on '040's 
  511. and up.  If this is the case, it would surely explain why most programmers 
  512. 'laze' out and only use a copy loop.  Of course I could be completely off my 
  513. rocker.
  514.  
  515. Tom =:p
  516.  
  517. mass@island.net
  518.  
  519. +++++++++++++++++++++++++++
  520.  
  521. >From cameron_esfahani@powertalk.apple.com (Cameron Esfahani)
  522. Date: Wed, 22 Nov 1995 02:18:42 -0800
  523. Organization: Apple Computer, Inc.
  524.  
  525. In article <48rpec$6vs@cliff.island.net>, mass@mail.island.net (Tom
  526. Stromar) wrote:
  527.  
  528. > >>I did some tests (modifying the code in MoveData app from Tricks of the
  529. > >>Mac Game Programming Gurus) between using doubles in a loop and BlockMove
  530. > >>in a loop and BlockMove still blew it away (200 ticks vs 146 ticks for
  531. > >>BlockMove) so why don't more people use BlockMove?
  532. > Hmmm, I thought I read somewhere that blockmove was only available on '040's 
  533. > and up.  If this is the case, it would surely explain why most programmers 
  534. > 'laze' out and only use a copy loop.  Of course I could be completely off my 
  535. > rocker.
  536. > Tom =:p
  537. > mass@island.net
  538.  
  539. Uh, your off your rocker.  BlockMove has been around since Day 1.  Thats
  540. why its trap # is so low...
  541.  
  542. Cameron Esfahani
  543.  
  544. +++++++++++++++++++++++++++
  545.  
  546. >From Mark Williams <Mark@streetly.demon.co.uk>
  547. Date: Wed, 22 Nov 95 09:42:32 GMT
  548. Organization: Streetly Software
  549.  
  550.  
  551. In article <meggs-2011952155080001@bootp-188-82.bootp.virginia.edu>, Andrew Meggs writes:
  552.  
  553. > In article <erichsen-1511951722510001@pm2-3.pacificnet.net>,
  554. > erichsen@pacificnet.net (Erichsen) wrote:
  555. > > I did some tests (modifying the code in MoveData app from Tricks of the
  556. > > Mac Game Programming Gurus) between using doubles in a loop and BlockMove
  557. > > in a loop and BlockMove still blew it away (200 ticks vs 146 ticks for
  558. > > BlockMove) so why don't more people use BlockMove?
  559. > > 
  560. > This got me interested, so I went and disassembled BlockMove. Surprisingly,
  561. > they aren't using doubles:
  562. >   BlockMove
  563. >      +00060 40A1C558   lwz        r5,0x0000(r3) 
  564. >      +00064 40A1C55C   lwz        r6,0x0004(r3)
  565. >      +00068 40A1C560   lwz        r7,0x0008(r3)
  566. >      +0006C 40A1C564   lwz        r8,0x000C(r3)
  567. >      +00070 40A1C568   lwz        r9,0x0010(r3) 
  568. >      +00074 40A1C56C   lwz        r10,0x0014(r3)
  569. >      +00078 40A1C570   lwz        r11,0x0018(r3)
  570. >      +0007C 40A1C574   lwz        r12,0x001C(r3)
  571. >      +00080 40A1C578   dcbz       0,r4          
  572. >      +00084 40A1C57C   addi       r3,r3,0x0020  
  573. >      +00088 40A1C580   dcbt       0,r3          
  574. >      +0008C 40A1C584   stw        r5,0x0000(r4) 
  575. >      +00090 40A1C588   stw        r6,0x0004(r4) 
  576. >      +00094 40A1C58C   stw        r7,0x0008(r4)
  577. >      +00098 40A1C590   stw        r8,0x000C(r4) 
  578. >      +0009C 40A1C594   stw        r9,0x0010(r4)
  579. >      +000A0 40A1C598   stw        r10,0x0014(r4)
  580. >      +000A4 40A1C59C   stw        r11,0x0018(r4) 
  581. >      +000A8 40A1C5A0   stw        r12,0x001C(r4) 
  582. >      +000AC 40A1C5A4   addi       r4,r4,0x0020  
  583. >      +000B0 40A1C5A8   bdnz       BlockMove+00060
  584. > The performance win is in the dcbz/dcbt pair. I'm assuming you weren't
  585. > copying to video memory, because that's marked uncacheable, and dcbz will
  586. > severely hurt performance if your destination is uncacheable.
  587. > I probably would have written it more like this, personally. Does anyone
  588. > have any idea what makes Apple's better? (Assuming it is...)
  589.  
  590. consecutive stfd's stall both pipelines. This means that (assuming all cache hits) you get one fp 
  591. store every 3 cycles, compared with one integer store every cycle. The result is 12 cycles to 
  592. transfer 4 words using fp registers, but only 10 cycles using integer registers. (see page I-175 of 
  593. the 601 User manual).
  594.  
  595. > ;assume source, destination, and size are all 32-byte aligned
  596. > ;set r3 to source address minus 8 and r4 to destination address minus 8
  597. > ;set ctr to size >> 5
  598. > BlockMoveLoop
  599. >    lfd      fp0,8(r3)
  600. >    lfd      fp1,16(r3)
  601. >    lfd      fp2,24(r3)
  602. >    lfdu     fp3,32(r3)
  603. >    dcbz     0,r4
  604. >    dcbt     0,r3
  605. >    stfd     fp0,8(r4)
  606. >    stfd     fp1,16(r4)
  607. >    stfd     fp2,24(r4)
  608. >    stfdu    fp3,32(r4)
  609. >    bdnz     BlockMoveLoop
  610.  
  611. One other problem with your code (and presumably why apple use the apparently wasteful addi 
  612. instructions rather than load/store with update) is that your dcbt instruction comes too late... fp3 
  613. already contains the double at r3 by the time you hit the dcbt 0,r3 instruction, so it has no 
  614. effect. Much worse, the dcbz always touches the block you wrote the _previous_ time through the 
  615. loop...
  616.  
  617. this could easily be fixed by preloading r5 with 8 and writing
  618.  
  619.     dcbz     r5,r4
  620.     dcbt     r5,r3
  621.  
  622. But you would still lose out on a 601. I _think_ it would be quicker on a 604, but i've not 
  623. checked.
  624. - --------------------------------------
  625. Mark Williams<Mark@streetly.demon.co.uk>
  626.  
  627. +++++++++++++++++++++++++++
  628.  
  629. >From mass@mail.island.net (Tom Stromar)
  630. Date: 23 Nov 1995 00:58:45 GMT
  631. Organization: Island Internet Customer
  632.  
  633. >> Hmmm, I thought I read somewhere that blockmove was only available on 
  634. '040's 
  635. >> and up.  If this is the case, it would surely explain why most programmers 
  636. >> 'laze' out and only use a copy loop.  Of course I could be completely off 
  637. my 
  638. >> rocker.
  639. >> 
  640. >> Tom =:p
  641. >> 
  642. >> mass@island.net
  643. >
  644. >Uh, your off your rocker.  BlockMove has been around since Day 1.  Thats
  645. >why its trap # is so low...
  646. >
  647. >Cameron Esfahani
  648.  
  649. Damnit, I hate it when I fall off this thing. I was confused between BlockMove 
  650. and that, that function, that... well.. I can't remember exactly but I'm sure 
  651. that the '040 had an 'instruction' (hence my confusion, long days at work 
  652. these days) that allowed larger chunks of data to be moved. Judging the way 
  653. *this* post is going, I'm definitely going to have to pay more attention to 
  654. what I read both on and off-line. My apologies.
  655.  
  656. Tom
  657.  
  658.  
  659. (so what the hell is the name of that instruction? Am I still off my rocker?)
  660.  
  661. +++++++++++++++++++++++++++
  662.  
  663. >From ericd@ra.nilenet.com (Eric A. Drumbor)
  664. Date: Wed, 22 Nov 1995 20:41:49 -0700
  665. Organization: BW Software
  666.  
  667. In article <490h05$v3f@cliff.island.net>, mass@mail.island.net (Tom
  668. Stromar) wrote:
  669.  
  670. [sniperino]
  671.  
  672. > Damnit, I hate it when I fall off this thing. I was confused between
  673. BlockMove 
  674. > and that, that function, that... well.. I can't remember exactly but I'm sure 
  675. > that the '040 had an 'instruction' (hence my confusion, long days at work 
  676. > these days) that allowed larger chunks of data to be moved. Judging the way 
  677. > *this* post is going, I'm definitely going to have to pay more attention to 
  678. > what I read both on and off-line. My apologies.
  679. > Tom
  680. > (so what the hell is the name of that instruction? Am I still off my rocker?)
  681.  
  682.      Ahem...Move16()?
  683.  
  684. -- 
  685. "Ah, voice come from cow on wall!"
  686. Eric A. Drumbor      
  687. ericd@ra.nilenet.com                 <http://www.nilenet.com/~ericd/>
  688. BW Software
  689.  
  690. +++++++++++++++++++++++++++
  691.  
  692. >From newquist@maxwell.ucdavis.edu (Jason Newquist)
  693. Date: 23 Nov 1995 03:14:15 GMT
  694. Organization: Maxwell at UCD Physics
  695.  
  696. Tom Stromar (mass@mail.island.net) wrote:
  697.  
  698. > (so what the hell is the name of that instruction? Am I still off my rocker?)
  699.  
  700. MOVE16 ?
  701.  
  702. Regards,
  703. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  704. Jason Newquist                          http://maxwell.ucdavis.edu/~newquist/
  705. newquist@maxwell.ucdavis.edu            eWorld - newquist@eworld.com
  706.  
  707. +++++++++++++++++++++++++++
  708.  
  709. >From staffan@sbbs.se (Staffan Svensson)
  710. Date: 21 Nov 95 19:17:38 GMT
  711. Organization: (none)
  712.  
  713. In article <48rpec$6vs@cliff.island.net>
  714. mass@mail.island.net (Tom Stromar) writes:
  715.  
  716. > >>I did some tests (modifying the code in MoveData app from Tricks of the
  717. > >>Mac Game Programming Gurus) between using doubles in a loop and BlockMove
  718. > >>in a loop and BlockMove still blew it away (200 ticks vs 146 ticks for
  719. > >>BlockMove) so why don't more people use BlockMove?
  720. > Hmmm, I thought I read somewhere that blockmove was only available on '040's 
  721. > and up.  If this is the case, it would surely explain why most programmers 
  722. > 'laze' out and only use a copy loop.  Of course I could be completely off my 
  723. > rocker.
  724.  
  725. Well not quite... Blockmove has been around for as long as there has
  726. been macs, but the special case BlockMoveData was introduced with the
  727. 040. I don't have any figures on the speed differences between these
  728. routines however, but, basically, BlockMove flushes the instruction
  729. cache and BlockMoveData does not.
  730.  
  731. ____________________ ____ ___ _ _  _   _     _            
  732.  Staffan Svensson
  733.  neonWare CESD
  734.  
  735. +++++++++++++++++++++++++++
  736.  
  737. >From cameron_esfahani@powertalk.apple.com (Cameron Esfahani)
  738. Date: Tue, 28 Nov 1995 01:24:06 -0800
  739. Organization: Apple Computer, Inc.
  740.  
  741. Actually no, BlockMoveData was introduced with System 7.5.  The code for
  742. it was kicking around Apple for a little while before we had a shipping
  743. vehicle for it.
  744.  
  745. Cameron Esfahani
  746.  
  747.  
  748. In article <30b225d2.0@news.sbbs.se>, staffan@sbbs.se (Staffan Svensson) wrote:
  749.  
  750. > Well not quite... Blockmove has been around for as long as there has
  751. > been macs, but the special case BlockMoveData was introduced with the
  752. > 040. I don't have any figures on the speed differences between these
  753. > routines however, but, basically, BlockMove flushes the instruction
  754. > cache and BlockMoveData does not.
  755. > ____________________ ____ ___ _ _  _   _     _            
  756. >  Staffan Svensson
  757. >  neonWare CESD
  758.  
  759. +++++++++++++++++++++++++++
  760.  
  761. >From deirdre@deeny.mv.com (Deirdre)
  762. Date: Tue, 28 Nov 1995 14:46:04 GMT
  763. Organization: Tarla's Secret Clench
  764.  
  765. BlockMove was available in System 1.0. However, the distinction between
  766. BlockMove and the newer call BlockMoveData is only significant on 040s and
  767. higher. On other machines it is the same trap.
  768.  
  769. _Deirdre
  770.  
  771. In article <48rpec$6vs@cliff.island.net>, mass@mail.island.net (Tom
  772. Stromar) wrote:
  773.  
  774. > Hmmm, I thought I read somewhere that blockmove was only available 
  775. > on '040's and up.  If this is the case, it would surely explain 
  776. > why most programmers 'laze' out and only use a copy loop.  Of course 
  777. > I could be completely off my rocker.
  778.  
  779. +++++++++++++++++++++++++++
  780.  
  781. >From kenp@nmrfam.wisc.edu (Ken Prehoda)
  782. Date: Wed, 29 Nov 1995 09:26:05 -0600
  783. Organization: Univ of Wisconsin-Madison, Dept of Biochemistry
  784.  
  785. In article <deirdre-2811950946040001@deeny.mv.com>, deirdre@deeny.mv.com
  786. (Deirdre) wrote:
  787.  
  788. : BlockMove was available in System 1.0. However, the distinction between
  789. : BlockMove and the newer call BlockMoveData is only significant on 040s and
  790. : higher. On other machines it is the same trap.
  791. : _Deirdre
  792. : In article <48rpec$6vs@cliff.island.net>, mass@mail.island.net (Tom
  793. : Stromar) wrote:
  794. : > Hmmm, I thought I read somewhere that blockmove was only available 
  795. : > on '040's and up.  If this is the case, it would surely explain 
  796. : > why most programmers 'laze' out and only use a copy loop.  Of course 
  797. : > I could be completely off my rocker.
  798.  
  799. As far as I can tell BlockMoveData is _only_ significant on the 040. 
  800. BlockMove does not flush the cache on the PPC's.
  801. _____________________________________________________________________________
  802. Ken Prehoda                                              kenp@nmrfam.wisc.edu
  803. Department of Biochemistry                         http://www.nmrfam.wisc.edu
  804. University of Wisconsin-Madison                             Tel: 608-263-9498
  805. 420 Henry Mall                                              Fax: 608-262-3453
  806.  
  807. +++++++++++++++++++++++++++
  808.  
  809. >From cameron_esfahani@powertalk.apple.com (Cameron Esfahani)
  810. Date: Wed, 29 Nov 1995 22:53:41 -0800
  811. Organization: Apple Computer, Inc.
  812.  
  813. That is not true.  BlockMove does flush the cache on the new PPCs.  Any
  814. PPC with a split cache (603/604 and any other ones) will require cache
  815. flushing.  So,  BlockMove on a 601-based machine doesn't flush the cache
  816. because it makes no sense, but on > 601-machines, it does flush.
  817.  
  818. Cameron Esfahani
  819.  
  820.  
  821. In article <kenp-2911950926050001@pressure.nmrfam.wisc.edu>,
  822. kenp@nmrfam.wisc.edu (Ken Prehoda) wrote:
  823.  
  824. > As far as I can tell BlockMoveData is _only_ significant on the 040. 
  825. > BlockMove does not flush the cache on the PPC's.
  826. > _____________________________________________________________________________
  827. > Ken Prehoda                                              kenp@nmrfam.wisc.edu
  828. > Department of Biochemistry                         http://www.nmrfam.wisc.edu
  829. > University of Wisconsin-Madison                             Tel: 608-263-9498
  830. > 420 Henry Mall                                              Fax: 608-262-3453
  831.  
  832. +++++++++++++++++++++++++++
  833.  
  834. >From mick@emf.net (Mick Foley)
  835. Date: Wed, 29 Nov 1995 22:23:29 -0800
  836. Organization: "emf.net" Quality Internet Access.  (510) 704-2929 (Voice)
  837.  
  838. In article <kenp-2911950926050001@pressure.nmrfam.wisc.edu>,
  839. kenp@nmrfam.wisc.edu (Ken Prehoda) wrote:
  840.  
  841. > As far as I can tell BlockMoveData is _only_ significant on the 040. 
  842. > BlockMove does not flush the cache on the PPC's.
  843.  
  844. Not on the 601 which has a unified cache. But it should make a big
  845. difference on the 603 and 604 which have split data and code caches.
  846.  
  847. Mick
  848.  
  849. +++++++++++++++++++++++++++
  850.  
  851. >From Ed Wynne <arwyn@engin.umich.edu>
  852. Date: 4 Dec 1995 04:09:26 GMT
  853. Organization: Arwyn, Inc.
  854.  
  855. In article <cameron_esfahani-2911952253410001@mac779.kip.apple.com>
  856. Cameron Esfahani, cameron_esfahani@powertalk.apple.com writes:
  857. >That is not true.  BlockMove does flush the cache on the new PPCs.  Any
  858. >PPC with a split cache (603/604 and any other ones) will require cache
  859. >flushing.  So,  BlockMove on a 601-based machine doesn't flush the cache
  860. >because it makes no sense, but on > 601-machines, it does flush.
  861. >
  862. >Cameron Esfahani
  863. >
  864.  
  865. Actually, thats almost right...  BlockMoveData CAN cause cache flushing on
  866. 601-based machines if they are running the DR emulator.  The processor
  867. cache
  868. doesn't get flushed but the emulator's internal cache of recompiled code
  869. does.  This process is probably a fair amount slower than the real on-chip
  870. cache flush since it is a software based operation.
  871.  
  872. To my knowledge the only machines so-far with this configuration would be
  873. the 7200 and 7500.  (does the 8500 have a 601 option?)
  874.  
  875. -ed
  876.  
  877.  
  878.  
  879.  
  880. ---------------------------
  881.  
  882. >From tully@pluto.njcc.com (Jeremy Tully)
  883. Subject: Hiding the menu bar
  884. Date: 27 Nov 1995 04:12:47 GMT
  885. Organization: None
  886.  
  887. Does anyone know if there is a routine to hide the menu bar?  I looked
  888. in my copy of Toolbox Essentials (don't have Think Reference __yet__),
  889. and I couldn't find one.  I assume it could be something as simple as
  890. HideMenuBar(), but I'm not sure (I looked in menus.h, but the closest I
  891. could find was ClearMenuBar, whose function I'm not sure of). Thanks
  892. for any help.
  893.  
  894. --
  895. Why doesn't the Bat Computer crash?
  896. --
  897. tully@pluto.njcc.com
  898.  
  899. +++++++++++++++++++++++++++
  900.  
  901. >From Anders.Wahlin@hum.gu.se (Anders Wahlin)
  902. Date: Tue, 28 Nov 1995 10:31:23 GMT
  903. Organization: Hum Fak:s Dataservice
  904.  
  905. In article <49bdrv$s1m@earth.njcc.com>, tully@pluto.njcc.com (Jeremy
  906. Tully) wrote:
  907.  
  908. > Does anyone know if there is a routine to hide the menu bar?  I looked
  909. > in my copy of Toolbox Essentials (don't have Think Reference __yet__),
  910. > and I couldn't find one.  I assume it could be something as simple as
  911. > HideMenuBar(), but I'm not sure (I looked in menus.h, but the closest I
  912. > could find was ClearMenuBar, whose function I'm not sure of). Thanks
  913. > for any help.
  914.  
  915. This might help you (Copied from Symantec's THINK Reference 2.0)
  916.  
  917.  
  918. /* CODE EXAMPLE #1 */
  919. /*
  920.  * How to hide the menubar
  921.  * This code sample shows how to hide the menubar.  It isn't something that you
  922.  * should really be doing (see the Apple Q&A stack for more), and the extra
  923.  * space might not 'work' ok (ie, it might not receive mouse-clicks and
  924. such), but
  925.  * it will enable you to draw on (or just obscure) the menu bar. Also, you
  926. should
  927.  * avoid calling ExitToShell without first calling ShowMenuBar, because you'll
  928.  * find that you have no menu bar. This code hasn't been tested with
  929. multiple monitor
  930.  * environments.
  931.  */
  932.  
  933. // Assumes inclusion of <MacHeaders>
  934.  
  935. void Init(void);
  936. void HideMenuBar(void);
  937. void ShowMenuBar(void);
  938.  
  939. void
  940. Init(void)
  941. {
  942.    InitGraf(&thePort);
  943.    InitFonts();
  944.    InitWindows();
  945.    TEInit();
  946.    InitDialogs(nil);
  947.    InitCursor();
  948. }
  949.  
  950. short oldMBarHeight;
  951. RgnHandle   mBarRgn;
  952.  
  953. void HideMenuBar()
  954. {
  955.    Rect  mBarRect;
  956.  
  957.    oldMBarHeight = GetMBarHeight();
  958.    MBarHeight = 0;         /* make the Menu Bar's height zero */
  959.    SetRect(&mBarRect, screenBits.bounds.left, screenBits.bounds.top,
  960.          screenBits.bounds.right, screenBits.bounds.top + oldMBarHeight);
  961.    mBarRgn = NewRgn();
  962.    RectRgn(mBarRgn, &mBarRect);
  963.    UnionRgn(GrayRgn, mBarRgn, GrayRgn);/* tell the desktop it covers the menu
  964.                                         * bar
  965.                                         */
  966.    PaintOne(nil, mBarRgn); /* redraw desktop */
  967. }
  968.  
  969. void ShowMenuBar()
  970. {
  971.    MBarHeight = oldMBarHeight;   /* make the menu bar's height normal */
  972.    DiffRgn(GrayRgn, mBarRgn, GrayRgn); /* remove the menu bar from the
  973.                                         * desktop
  974.                                         */
  975.    DisposeRgn(mBarRgn);
  976. }
  977.  
  978. main()
  979. {
  980.    Init();
  981.    HideMenuBar();
  982.    while (!Button())
  983.          ;
  984.    ShowMenuBar();
  985. }
  986.  
  987. -- 
  988. Anders Wahlin
  989. Anders.Wahlin@hum.gu.se
  990.  
  991. +++++++++++++++++++++++++++
  992.  
  993. >From tinsel@uiuc.edu (Thomas Aaron Insel)
  994. Date: 28 Nov 95 06:58:22 GMT
  995. Organization: Defenestrating Illini, Urbana Illinois
  996.  
  997. tully@pluto.njcc.com (Jeremy Tully) writes:
  998.  
  999. > Does anyone know if there is a routine to hide the menu bar?  I looked
  1000. > in my copy of Toolbox Essentials (don't have Think Reference __yet__),
  1001. > and I couldn't find one.  I assume it could be something as simple as
  1002. > HideMenuBar(), but I'm not sure (I looked in menus.h, but the closest I
  1003. > could find was ClearMenuBar, whose function I'm not sure of). Thanks
  1004. > for any help.
  1005.  
  1006. I don't think it's quite that simple, and I don't know the answer, but
  1007. I'm nearly positive that there's sample code somewhere on
  1008. http://dev.info.apple.com for exactly this.
  1009.  
  1010. Tom
  1011. -- 
  1012. Thomas Insel (tinsel@uiuc.edu)
  1013.   "Republicans understand the importance of bondage between a mother and 
  1014.    child." -- Vice President Dan Quayle
  1015.  
  1016. +++++++++++++++++++++++++++
  1017.  
  1018. >From catambay#m#bill@mmac.is.lmsc.lockheed.com (Bill the Cat)
  1019. Date: 30 Nov 1995 23:13:42 GMT
  1020. Organization: MacPascal Mailing List
  1021.  
  1022. In article <49bdrv$s1m@earth.njcc.com>, tully@pluto.njcc.com (Jeremy
  1023. Tully) wrote:
  1024.  
  1025. > Does anyone know if there is a routine to hide the menu bar?  I looked
  1026. > in my copy of Toolbox Essentials (don't have Think Reference __yet__),
  1027. > and I couldn't find one.  I assume it could be something as simple as
  1028. > HideMenuBar(), but I'm not sure (I looked in menus.h, but the closest I
  1029. > could find was ClearMenuBar, whose function I'm not sure of). Thanks
  1030. > for any help.
  1031. > --
  1032. > Why doesn't the Bat Computer crash?
  1033. > --
  1034. > tully@pluto.njcc.com
  1035.  
  1036. No built-in function for doing this, but here's some code that does:
  1037.  
  1038. Var
  1039.    save_mbar:   integer;
  1040.    mBarRgn:    rgnHandle;
  1041.    GrayRgn:    RgnHandle;
  1042.  
  1043. Procedure SH_ForceUpdate(rgn: RgnHandle);
  1044.  
  1045. Var
  1046.    wpFirst: WindowRef;
  1047.    
  1048.    begin
  1049.    wpFirst := LMGetWindowList;
  1050.    PaintBehind(wpFirst, rgn);                   
  1051.    CalcVisBehind(wpFirst, rgn);                 
  1052.    end;
  1053.    
  1054. Procedure GetMBarRgn(mbarRgn: RgnHandle);
  1055.  
  1056. Var
  1057.    mbarRect:   Rect;
  1058.  
  1059.    begin
  1060.    mBarRect := qd.screenBits.bounds;         
  1061.    mBarRect.bottom := mBarRect.top + save_mbar;
  1062.    RectRgn(mBarRgn, mBarRect);            
  1063.    end;
  1064.  
  1065. Procedure RemoveMbar;
  1066.  
  1067.    begin
  1068.    save_mbar := GetMBarHeight;
  1069.    mBarRgn := NewRgn;
  1070.    GetMBarRgn(mBarRgn);          { make a region for the mbar }
  1071.    LMSetMBarHeight(0);
  1072.    GrayRgn := LMGetGrayRgn;
  1073.    UnionRgn(GrayRgn,mBarRgn,GrayRgn);
  1074.    SH_ForceUpdate(mBarRgn);
  1075.    end;
  1076.  
  1077. Procedure ResetMbar;
  1078.  
  1079.    begin
  1080.    LMSetMBarHeight(save_mbar);
  1081.    DiffRgn(GrayRgn, mBarRgn, GrayRgn); 
  1082.    DisposeRgn(mBarRgn);          { dispose the bar region }
  1083.    DrawMenuBar;   
  1084.    end;
  1085.  
  1086. _____________________________________________________________________
  1087. Bill Catambay
  1088. Pascal Programmer on Macintosh and Open VMS
  1089.  
  1090.               />
  1091.              //   The purpose of software engineering  
  1092.      (//////[O]>=========================================-
  1093.              \\    is to manage complexity, not to create it.
  1094.               \>
  1095.  
  1096. ____________________________________________________________________
  1097.         
  1098. +++++++++++++++++++++++++++
  1099.  
  1100. >From Darren Giles <mars@netcom.com>
  1101. Date: Fri, 1 Dec 1995 21:25:12 GMT
  1102. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1103.  
  1104. >> Does anyone know if there is a routine to hide the menu bar?
  1105. >
  1106. >No built-in function for doing this, but here's some code that does:
  1107.  
  1108.  
  1109. Actually, there is now support for this... in QuickTime, interestingly
  1110. enough.  Check out the QT 2.1 API, if that works for you.
  1111.  
  1112. - Darren
  1113.  
  1114. ==========================================================================
  1115. Darren Giles, Technical Director                        Terran Interactive
  1116. For info on Cleaner QuickTime compression, visit http://www.terran-int.com
  1117.  
  1118. +++++++++++++++++++++++++++
  1119.  
  1120. >From fsstw@aurora.alaska.edu (Mountain Dew Man!)
  1121. Date: 5 Dec 1995 08:13:05 GMT
  1122. Organization: University of Alaska Fairbanks
  1123.  
  1124. Sorry not to post to the original message, I missed it.
  1125.  
  1126. There are a pair of routines as part of videotoolbox (available on 
  1127. infomac in the programming area under libraries I believe).  It is in the 
  1128. file HideMenuBar.c which also has ShowMenuBar, SquareCorners, and 
  1129. RestoreCorners to allow you to use your whole screen and put it back again.
  1130.  
  1131. Also note there are gobs of other routines in that package, which by the 
  1132. way was intended for use by some branch of psychologists, but many are 
  1133. designed around being fast and for grpahical manipulations, and well 
  1134. suited for games in many ways.
  1135.  
  1136. See Yah!
  1137.  
  1138. Thomas Aaron Insel (tinsel@uiuc.edu) wrote:
  1139. : tully@pluto.njcc.com (Jeremy Tully) writes:
  1140.  
  1141. : > Does anyone know if there is a routine to hide the menu bar?  I looked
  1142. : > in my copy of Toolbox Essentials (don't have Think Reference __yet__),
  1143. : > and I couldn't find one.  I assume it could be something as simple as
  1144. : > HideMenuBar(), but I'm not sure (I looked in menus.h, but the closest I
  1145. : > could find was ClearMenuBar, whose function I'm not sure of). Thanks
  1146. : > for any help.
  1147.  
  1148. : I don't think it's quite that simple, and I don't know the answer, but
  1149. : I'm nearly positive that there's sample code somewhere on
  1150. : http://dev.info.apple.com for exactly this.
  1151.  
  1152. : Tom
  1153. : -- 
  1154. : Thomas Insel (tinsel@uiuc.edu)
  1155. :   "Republicans understand the importance of bondage between a mother and 
  1156. :    child." -- Vice President Dan Quayle
  1157.  
  1158. --
  1159. _____________________________________________________________________
  1160. Seann Woolery  --  Running in circles does that to you...
  1161. _____________________________________________________________________
  1162. FSSTW@AURORA.ALASKA.EDU
  1163. _____________________________________________________________________
  1164.  
  1165. ---------------------------
  1166.  
  1167. >From jpurlia@qualcomm.com (John Purlia)
  1168. Subject: MoveControl and popup menus
  1169. Date: Mon, 27 Nov 1995 12:56:56 -0800
  1170. Organization: QUALCOMM, Inc.
  1171. Today's toolbox teaser:
  1172.  
  1173. How do you (safely) relocate the standard popup menu control WITHOUT
  1174. calling MoveControl?
  1175.  
  1176. MoveControl has the annoying habit of calling both HideControl and
  1177. ShowControl to first erase, move, then redisplay a control.  Trouble is,
  1178. there are circumstances under which you might not want to perform all that
  1179. redrawing, instead intending to simply move the control's location in the
  1180. window.  For example, a call to ScrollRect moves a control "visually" and
  1181. smoothly, however the control itself still needs to be moved in order to
  1182. respond to subsequent hits, etc.  Calling MoveControl performs the
  1183. necessary relocation, albeit with the ugly cost of first erasing the
  1184. control's previous location, then redrawing over the new location (again
  1185. erasing over the previously scrolled control).
  1186.  
  1187. No big deal, there are a couple of easy ways to attain the desired results:
  1188.  
  1189. 1. Don't call MoveControl.  Instead, relocate the control's rectangle
  1190.    exlicitly like so:
  1191.  
  1192.         OffsetRect (&(*theControl)->contrlRect, h, v);
  1193.  
  1194.    Works fine, it's fast, and it creates the illusion of the control moving
  1195.    after the window's been scrolled.  Of course, it also runs the risk of
  1196.    breaking in the future if the structure of the control record changes.
  1197.  
  1198. 2. Call MoveControl, but only after first making the control invisible.  Trouble
  1199.    is, you again can't make the control invisible via the toolbox because
  1200.    HideControl erases, so you end up with something like this:
  1201.  
  1202.         (*theControl)->contrlVis = 0;
  1203.         MoveControl (theControl, left, top);
  1204.         (*theControl)->contrlVis = 255;
  1205.  
  1206.    Again, this works, but once again at the risk of future incompatibility.
  1207.  
  1208. 3. Go nuts with the clip region (paraphrasing):
  1209.  
  1210.         // save the clip region
  1211.         // create a new clip region
  1212.         // subtract the control's original location from the new clip region
  1213.         // subtract the control's new location from the new clip region
  1214.         // Set the new clip region
  1215.         MoveControl (theControl, left, top);
  1216.         // Set the saved clip region
  1217.  
  1218.    Seems clean and correct, but it is terribly inefficient and VERY slow when
  1219.    all that is intended is to simply relocate the control's bounding rectangle.
  1220.  
  1221.  
  1222. For the standard button controls, either approach 1 or 2 is really good
  1223. enough to achieve the desired results.  Popup menu controls, however, are
  1224. another story.
  1225.  
  1226. Moving the popup's control rectangle as in approach 1 does not completely
  1227. move the control.  Though the test area of the control *is* moved to the
  1228. correct location, clicks in the control popup the menu in the previous
  1229. control location.
  1230.  
  1231. Likewise, approach 2 -- though MoveControl *is* being called -- does not
  1232. fully relocate all the pieces of the popup control.  In this case,
  1233. subsequent calls to Draw1Control first erase the old location before
  1234. drawing in the location we just moved to.  Weird!!  A call to MoveControl
  1235. should move ALL portions of a control regardless of whwther or not the
  1236. control is visible -- which is apparently not the case when dealing with
  1237. the standard popup control.
  1238.  
  1239. So...  How can the standard popup control be relocated without calling
  1240. MoveControl?  From walking through popup CDEF is looks like part of the
  1241. popup private data record stored in the control's contrlData field
  1242. contains one or more rectangles or points used to specify the location of
  1243. the menu portion of the control (the part that appears to do all the
  1244. erasing).  Though it may be viewed as evil and against the rules, I'd like
  1245. to be able to explicitly set this rectangle to the "new" location of the
  1246. popup after it has been scrolled.
  1247.  
  1248. Of course, if the Control Manager sported a RelocateControl command, or
  1249. even safe accessor functions to the control record, I wouldn't now feel so
  1250. underhanded.  :)
  1251.  
  1252. Thanks!
  1253.  
  1254. -- John
  1255.  
  1256. +++++++++++++++++++++++++++
  1257.  
  1258. >From ari@shore.net (Ari Halberstadt)
  1259. Date: Tue, 28 Nov 1995 07:22:58 -0400
  1260. Organization: North Shore Access/Eco Software, Inc; (info@shore.net)
  1261.  
  1262. In article <jpurlia-2711951256560001@jpurlia-ppc.qualcomm.com>,
  1263. jpurlia@qualcomm.com (John Purlia) wrote:
  1264. >3. Go nuts with the clip region (paraphrasing):
  1265. >
  1266. >        // save the clip region
  1267. >        // create a new clip region
  1268. >        // subtract the control's original location from the new clip region
  1269. >        // subtract the control's new location from the new clip region
  1270. >        // Set the new clip region
  1271. >        MoveControl (theControl, left, top);
  1272. >        // Set the saved clip region
  1273. >
  1274. >   Seems clean and correct, but it is terribly inefficient and VERY slow when
  1275. >   all that is intended is to simply relocate the control's bounding rectangle.
  1276. >
  1277.  
  1278. This is the best solution. I use a similar approach and it works nicely.
  1279. You don't really need to do the math with the clip region: just set it to
  1280. an empty region before calling MoveControl. The inefficiency is minimal.
  1281. Allocating a region is fast (you could preallocate it and store it in a
  1282. private static if you were really concerned). Getting and setting the clip
  1283. region are fast (setting it is especially fast). QuickDraw always checks
  1284. against the clip region before drawing, and is probably optimized to
  1285. handle an empty clip region.
  1286.  
  1287. /* Definitions for Strict Controls (until Apple provides them) */
  1288. #if ! STRICT_CONTROLS
  1289.    #define IsControlVisible(ctl)    (((**((ControlHandle) ctl)).contrlVis) != 0)
  1290.    #define GetControlHilite(ctl)    ((**((ControlHandle) ctl)).contrlHilite)
  1291.    #define GetControlData(ctl)      ((**((ControlHandle) ctl)).contrlData)
  1292.    #define GetControlRect(ctl, r)   ((void) ((*r) = (**((ControlHandle)
  1293. ctl)).contrlRect))
  1294.    #define GetControlOwner(ctl)     ((**((ControlHandle) ctl)).contrlOwner)
  1295.    #define GetControlDefProc(ctl)   ((**((ControlHandle) ctl)).contrlDefProc)
  1296. #endif
  1297.  
  1298. void RelocateControl(ControlHandle inControl, short inLeft, short inTop)
  1299. {
  1300.    RgnHandle oldClipRgn = NewRgn();
  1301.    RgnHandle emptyClipRgn = NewRgn();
  1302.    GrafPtr oldPort = NULL;
  1303.    assert(oldClipRgn && emptyClipRgn);
  1304.    GetPort(&oldPort);
  1305.    SetPort(GetWindowPort(GetControlOwner(inControl)));
  1306.    GetClip(oldClipRgn);
  1307.    SetClip(emptyClipRgn);
  1308.    MoveControl(inControl, inLeft, inTop);
  1309.    SetClip(oldClipRgn);
  1310.    SetPort(oldPort);
  1311.    DisposeRgn(oldClipRgn);
  1312.    DisposeRgn(emptyClipRgn);
  1313. }
  1314.  
  1315. >Likewise, approach 2 -- though MoveControl *is* being called -- does not
  1316. >fully relocate all the pieces of the popup control.  In this case,
  1317.  
  1318. Sounds like a bug in the popup CDEF.
  1319.  
  1320. >So...  How can the standard popup control be relocated without calling
  1321. >MoveControl?  From walking through popup CDEF is looks like part of the
  1322. >popup private data record stored in the control's contrlData field
  1323. >contains one or more rectangles or points used to specify the location of
  1324. >the menu portion of the control (the part that appears to do all the
  1325. >erasing).  Though it may be viewed as evil and against the rules, I'd like
  1326. >to be able to explicitly set this rectangle to the "new" location of the
  1327. >popup after it has been scrolled.
  1328.  
  1329. Not a good idea. Will break in a different version.
  1330.  
  1331. -- Ari Halberstadt (ari@shore.net, ari@world.std.com)
  1332. <http://www.shore.net/~ari/> (under construction)
  1333.  
  1334. ---------------------------
  1335.  
  1336. >From magesteve@aol.com (Mage Steve)
  1337. Subject: Non-resource custom PowerPC LDEF
  1338. Date: 24 Nov 1995 03:48:16 -0500
  1339. Organization: America Online, Inc. (1-800-827-6364)
  1340.  
  1341. Anyone know this one?
  1342.  
  1343. I wish to use the List Manager to display some information using a custom
  1344. LDEF.  I do not want the LDEF to be a resource, but instead to be an
  1345. internal function in my code.  How do I do this under the new PowerPC
  1346. methods?  I have some old Pascal code that does this by creating a pointer
  1347. to my function, then setting the listDefProc field of the list handle to
  1348. point to the pointer (the field expects a handle to the function, this
  1349. fools it).  I expect similiar method would work in C++, but I am concern
  1350. about how to write it in PowerPC Native code.
  1351.  
  1352. Any comments anyone?
  1353.  
  1354. Please drop a note online AND email it to me!
  1355.  
  1356. Thanks!
  1357.  
  1358. Steve Sheets
  1359. Mageware
  1360.  
  1361. +++++++++++++++++++++++++++
  1362.  
  1363. >From d88-bli@xbyse.nada.kth.se (Bo Lindbergh)
  1364. Date: 25 Nov 1995 07:26:33 GMT
  1365. Organization: Royal Institute of Technology, Stockholm, Sweden
  1366.  
  1367. static pascal void mylistdef(
  1368.     short lMessage,
  1369.     Boolean lSelect,
  1370.     Rect *lRect,
  1371.     Cell lCell,
  1372.     short lDataOffset,
  1373.     short lDataLen,
  1374.     ListRef lHandle)
  1375. {
  1376.     /* whatever... */
  1377. }
  1378.  
  1379. static RoutineDescriptor mylistdefdesc =
  1380.     BUILD_ROUTINE_DESCRIPTOR(uppListDefProcInfo,mylistdef);
  1381.  
  1382. static void setupldef(void)
  1383. {
  1384.     Handle ldefh;
  1385.  
  1386.     ldefh=Get1Resource('LDEF',myldefid);
  1387.     SetHandleSize(ldefh,sizeof (RoutineDescriptor));
  1388.     **(RoutineDescriptorHandle)ldefh=mylistdefdesc;
  1389. }
  1390.  
  1391.  
  1392.  
  1393. +++++++++++++++++++++++++++
  1394.  
  1395. >From owen@ids.net (Owen Hartnett)
  1396. Date: Sat, 25 Nov 1995 11:02:28 -0600
  1397. Organization: IDS World Network Internet Access Service, (401) 885-4243
  1398.  
  1399. In article <4940sg$6g3@newsbf02.news.aol.com>, magesteve@aol.com (Mage
  1400. Steve) wrote:
  1401.  
  1402. > Anyone know this one?
  1403. > I wish to use the List Manager to display some information using a custom
  1404. > LDEF.  I do not want the LDEF to be a resource, but instead to be an
  1405. > internal function in my code.  How do I do this under the new PowerPC
  1406. > methods?  I have some old Pascal code that does this by creating a pointer
  1407. > to my function, then setting the listDefProc field of the list handle to
  1408. > point to the pointer (the field expects a handle to the function, this
  1409. > fools it).  I expect similiar method would work in C++, but I am concern
  1410. > about how to write it in PowerPC Native code.
  1411.  
  1412. The NewsWatcher source, available for ftp, does this.
  1413.  
  1414. -Owen
  1415.  
  1416. +++++++++++++++++++++++++++
  1417.  
  1418. >From Matt Slot <fprefect@umich.edu>
  1419. Date: 1 Dec 1995 02:18:34 GMT
  1420. Organization: University of Michigan
  1421.  
  1422. Mage Steve, magesteve@aol.com writes:
  1423.  > I wish to use the List Manager to display some information using a custom
  1424.  > LDEF.  I do not want the LDEF to be a resource, but instead to be an
  1425.  > internal function in my code.  How do I do this under the new PowerPC
  1426.  > methods?  I have some old Pascal code that does this by creating a pointer
  1427.  > to my function, then setting the listDefProc field of the list handle to
  1428.  > point to the pointer (the field expects a handle to the function, this
  1429.  > fools it).  I expect similiar method would work in C++, but I am concern
  1430.  > about how to write it in PowerPC Native code.
  1431.  
  1432. Try this sample code, which uses a PPC RoutineDescriptor for the LDEF stub:
  1433.  
  1434.  
  1435. Handle SetupCallbackLDEF() {
  1436.         Handle stubHandle;
  1437.         
  1438. #if !GENERATINGPOWERPC
  1439.         ProcPtr proc = (ProcPtr) myLDEFProc;
  1440.         
  1441.         stubHandle = NewHandle(6);
  1442.         if (! stubHandle) return(0);
  1443.         
  1444.         (* (short **) stubHandle)[0] = 0x4EF9;  // 68K jump instruction
  1445.         BlockMove(&myLDEFProc, *stubHandle + 4, sizeof(myLDEFProc));
  1446.         
  1447.         // Flush the cache here...
  1448.  
  1449. #else
  1450.         RoutineDescriptor
  1451.                 rd = BUILD_ROUTINE_DESCRIPTOR(uppListDefProcInfo, myLDEFProc);
  1452.         
  1453.         stubHandle = NewHandle(sizeof(rd));
  1454.         if (! stubHandle) return(0);
  1455.  
  1456.         BlockMoveData(&rd, *(*gHdl)->MimeListDef, sizeof(rd));  
  1457. #endif
  1458.  
  1459.         return(stubHandle);
  1460.         }
  1461.  
  1462.  
  1463. Of course, I am think you really should load the LDEF stub's handle from 
  1464. a resource, pass the resID to the LNew() call, and then detach it. Remember
  1465. that LNew() passes an Init message to the LDEF... and you don't want to let
  1466. the system LDEF get that message, or you will get a memory leak when it
  1467. allocates data.
  1468.  
  1469. Also, if you want to avoid flushing the cache in the 68K code, you can
  1470. replace the "6-byte" trick with longer, but safer, inline assembler:
  1471.  
  1472.  
  1473. asm void NoFlushStub() {
  1474.         bra.s   @past_data
  1475. @data:
  1476.         dc.l    0                               ; The ProcPtr gets inserted here
  1477. @past_data:
  1478.         move.l  @data, a0
  1479.         jmp             (a0)
  1480.         } 
  1481.  
  1482.  
  1483. Disassemble this, and you can stuff it into your handle as normal. Since
  1484. it never really modifies a 68K instruction, you don't have to flush the
  1485. cache (the move.l loads the procptr from the data cache). Of course, the
  1486. PPC routine descriptor is never executed whether called from PPC (CallUPP
  1487. simply dispatches to the ProcPtr) or from 68K (its "executed" by the 
  1488. emulator, and never hits the instruction cache).
  1489.  
  1490. Good Luck!
  1491.  
  1492. Matt
  1493.  
  1494. ---------------------------
  1495.  
  1496. >From dkkramer@artsci.wustl.edu (Jerry Adlersfluegel)
  1497. Subject: OpenDoc lingo
  1498. Date: Fri, 01 Dec 1995 01:20:51 -0600
  1499. Organization: Washington University in St. Louis, MO USA
  1500.  
  1501. I've been reading all this OpenDoc stuff, and follow it pretty well. (I'm
  1502. no programmer.) But there's one thing that's kind of bugging me. 
  1503.  
  1504. It seems people (myself included) are confused about all the terms: part,
  1505. document, container, editor, etc. Container is used instead of document,
  1506. editors are called parts, documents are called parts, editors are called
  1507. containers, and so on. 
  1508.  
  1509. For all of our sakes, could someone please list the 'real' definitions for
  1510. the above terms (and whatever I didn't include).
  1511.  
  1512. I have a pretty good idea of what they all are, but I would like to see
  1513. them clarified here for everyone.
  1514.  
  1515. Thanks!
  1516.  
  1517. -- 
  1518. Jerry Adlersfluegel                 (from my gf's account because 
  1519. adlerspj@pxa.slu.edu                     my school's systems bite)
  1520.                     <<Smilie free zone>>
  1521.  
  1522. +++++++++++++++++++++++++++
  1523.  
  1524. >From Kerry Ortega <kortega@apple.com>
  1525. Date: 1 Dec 1995 20:04:17 GMT
  1526. Organization: Apple
  1527.  
  1528. In article <dkkramer-0112950120510001@dialin-1.wustl.edu> Jerry
  1529. Adlersfluegel, dkkramer@artsci.wustl.edu writes:
  1530. >no programmer.) But there's one thing that's kind of bugging me. 
  1531.  
  1532.  
  1533. I guess the confusion is that many of the terms are very closely related.
  1534. For example a Document is a collection of parts but always contains
  1535. something called a root part.  To an end user the root part and the
  1536. Document are the same thing.  If the root part allows embedding it's also
  1537. a container part and so forth.  Below are some common OpenDoc terms.  I
  1538. hope this helps clear up some of the confusion.
  1539.  
  1540. Kerry Ortega
  1541. Apple's OpenDoc Human Interface Team
  1542.  
  1543.  
  1544. Document - In OpenDoc, a user-organized collection of parts, all stored
  1545. together.
  1546.  
  1547. Compound document - A single document containing multiple heterogeneous
  1548. data types, each presented and edited by its own software. A compound
  1549. document is made up of parts.
  1550.  
  1551. Draft - A version of a document, defined at a certain point in time by
  1552. the user. A document is made up of a set of drafts.
  1553.  
  1554. Part - A portion of a compound document; it consists of document content,
  1555. plus-at runtime-a part editor that manipulates that content. The content
  1556. is data of a given structure or type, such as text, graphics, or video;
  1557. the code is a part editor.
  1558.  
  1559. Container part - A part that is capable of embedding other parts within
  1560. its content
  1561.  
  1562. Embedding  - One part is inserted into the contents of another part. The
  1563. inserted part maintains its part identity. The receiving part decides
  1564. layout issues such as whether the new part overlaps existing parts in its
  1565. contents.
  1566.  
  1567. Root part - The part that forms the base of a document and establishes
  1568. its basic editing, embedding, and printing behavior. A document has only
  1569. one root part, which can contain content elements and perhaps other,
  1570. embedded parts. Any part can be a root part.
  1571.  
  1572.  
  1573. Stationery - A part which has the Stationery property set. The only
  1574. difference between a normal part and a stationery part is in the Open
  1575. behavior. When you open a normal part, it opens into a window. When you
  1576. open a stationery part, it creates ("tears off") a new part, saves the
  1577. copy to disk with a unique name, and opens that copy, leaving the
  1578. stationery unchanged. Thus stationery is just an accelerator for
  1579. duplicating an existing part and then opening it. This allows documents
  1580. containing boiler-plate to be easily used to create new documents. We
  1581. encourage developers to deliver their parts as stationery pads, since
  1582. this will prevent accidentally modifying the original.
  1583.  
  1584. Hot part - A part, such as a button, that performs an action (like
  1585. running a script), rather than activating itself, when it receives a
  1586. mouse click.
  1587.  
  1588.  
  1589. Part editor - An OpenDoc component that can display and change the data
  1590. of a part. It is the executable code that provides the behavior for the
  1591. part. Compare part viewer.
  1592.  
  1593. Part viewer - A part editor that can display and print, but not change,
  1594. the data of a part. Compare part editor.
  1595.  
  1596.  
  1597. Part Contents - In general, a part can contain two types of data:
  1598. intrinsic contents and other parts. There is no requirement that parts be
  1599. able to do contain other parts, and some won't be able to. But a key
  1600. characteristic of OpenDoc is that if a part can contain one kind of part,
  1601. it can contain all kinds of parts, since OpenDoc supplies a uniform
  1602. wrapper for parts. (Contrast this with the small number of standard data
  1603. types supported today, such as text, PICT,
  1604. TIFF, etc.)
  1605.  
  1606. Intrinsic Contents - Data which is intrinsic to a particular type of
  1607. part. For example, text parts contain characters. Graphics parts may
  1608. contain lines and circles. Spreadsheet parts contain spreadsheet cells.
  1609. Video parts contain digitized video. Sound parts contain digitized sound.
  1610. Simulation parts contain executable code. And so on. The part developer
  1611. determines what intrinsic contents a part may contain. 
  1612.  
  1613.  
  1614. Part category  - A general classification of the format of data handled
  1615. by a part editor. Categories are broad classes of data format, meaningful
  1616. to end users, such as "text", "graphics" or "table". Compare part kind.
  1617.  
  1618. Part kind  - A specific classification of the format of data handled by a
  1619. part editor. A kind specifies the specific data format handled by a part
  1620. editor. Kinds are meaningful to end users, and have designations such as
  1621. such as "MacWrite 2.0" or "QuickTime 1.0". Compare part category.
  1622.  
  1623.  
  1624. Active / Inactive Parts - A part may be active or inactive. Being active
  1625. means that the part contains the selection (or caret). For a part to be
  1626. active, its contents must be visible, i.e. it must be displayed in a
  1627. window or frame. Normally the active part receives commands and keyboard
  1628. events, and its frame border, menu, palettes, and other user interface
  1629. techniques are displayed. At most one part is active at a time. A part is
  1630. made active by user actions such as clicking the mouse or dragging
  1631. something into its contents. When a part is activated, the previously
  1632. active part, if any, becomes inactive. The frame border, menu, palettes,
  1633. etc. of inactive parts are not displayed. Being inactive does not mean
  1634. that a part isn't running. Parts may execute asynchronously whether they
  1635. are active or inactive, even if they are displayed as icons.
  1636.  
  1637. +++++++++++++++++++++++++++
  1638.  
  1639. >From howlett@netcom.com (Scott Howlett)
  1640. Date: Fri, 1 Dec 1995 19:26:49 GMT
  1641. Organization: (or lack thereof)
  1642.  
  1643. In article <...m>, jaks@netcom.com (Eric Jackson) wrote:
  1644. ..
  1645. > >For all of our sakes, could someone please list the 'real' definitions for
  1646. > >the above terms (and whatever I didn't include).
  1647.  
  1648. > Part:
  1649. > This is an OpenDoc part.  There are two types of parts called editors and
  1650. > viewers.  There is another way that OpenDoc parts can differ.  Some parts
  1651. > called container parts can have other parts embeded inside of them.
  1652. > If you want to see your OpenDoc parts you can look in your Editors folder
  1653. > because that is where they live.
  1654.  
  1655. Umm, doesn't "Part" refer to the data itself? The thing you use to edit
  1656. a part is a "part editor" and the thing you use to just look at a part
  1657. in the absence of a part editor is a "part viewer".
  1658.  
  1659. Or am I mistaken?
  1660.  
  1661. - Scott
  1662.  
  1663. -- 
  1664. Scott Howlett, howlett@netcom.com
  1665. "Probably the earliest fly swatters were nothing more than some sort of 
  1666. striking surface attached to the end of a long stick."
  1667.  
  1668. +++++++++++++++++++++++++++
  1669.  
  1670. >From Kerry Ortega <kortega@apple.com>
  1671. Date: 1 Dec 1995 23:17:15 GMT
  1672. Organization: Apple
  1673.  
  1674. Oh I forgot to mention that OpenDoc terms are defined on the CILabs
  1675. website as well.
  1676.  
  1677. Checkout http://www.cilabs.org/docs/glossary.html
  1678.  
  1679. Kerry Ortega
  1680.  
  1681. +++++++++++++++++++++++++++
  1682.  
  1683. >From dkkramer@artsci.wustl.edu (Donna Kellee Kramer)
  1684. Date: 2 Dec 1995 03:56:58 GMT
  1685. Organization: College of Arts and Sciences -- Washington University, St. Louis, Missouri, USA
  1686.  
  1687. Scott Howlett (howlett@netcom.com) wrote:
  1688. > In article <...m>, jaks@netcom.com (Eric Jackson) wrote:
  1689. > ..
  1690. > > >For all of our sakes, could someone please list the 'real' definitions for
  1691. > > >the above terms (and whatever I didn't include).
  1692.  
  1693. > > Part:
  1694. > > 
  1695. > > This is an OpenDoc part.  There are two types of parts called editors and
  1696. > > viewers.  There is another way that OpenDoc parts can differ.  Some parts
  1697. > > called container parts can have other parts embeded inside of them.
  1698. > > 
  1699. > > If you want to see your OpenDoc parts you can look in your Editors folder
  1700. > > because that is where they live.
  1701.  
  1702. > Umm, doesn't "Part" refer to the data itself? The thing you use to edit
  1703. > a part is a "part editor" and the thing you use to just look at a part
  1704. > in the absence of a part editor is a "part viewer".
  1705.  
  1706. > Or am I mistaken?
  1707.  
  1708. I think you are right. "Part" is Apple's "civilian" word for "Object."
  1709.  
  1710. And a container is a special editor that contains several editors or 
  1711. viewers. That's kind of the short route to porting an application to OD. 
  1712.  
  1713. We _need_ a nomenclature guide, here.
  1714.  
  1715.  
  1716.  
  1717. +++++++++++++++++++++++++++
  1718.  
  1719. >From dkkramer@artsci.wustl.edu (Jerry Adlersfluegel)
  1720. Date: Sun, 03 Dec 1995 12:58:37 -0600
  1721. Organization: Washington University in St. Louis, MO USA
  1722. In article <49nn41$8k4@apple.com>, Kerry Ortega <kortega@apple.com> wrote:
  1723.  
  1724. [Everything I wanted to see!]
  1725.  
  1726.  
  1727. Thank you, Kerry.
  1728.  
  1729. -- 
  1730. Jerry Adlersfluegel                 (from my gf's account because 
  1731. adlerspj@pxa.slu.edu                     my school's systems bite)
  1732.                     <<Smilie free zone>>
  1733.  
  1734. +++++++++++++++++++++++++++
  1735.  
  1736. >From fms@athena.mit.edu (Fletcher Sandbeck)
  1737. Date: 3 Dec 1995 20:38:36 GMT
  1738. Organization: Massachusetts Institute of Technology
  1739.  
  1740. >It seems people (myself included) are confused about all the terms: part,
  1741. >document, container, editor, etc. Container is used instead of document,
  1742. >editors are called parts, documents are called parts, editors are called
  1743. >containers, and so on. 
  1744.  
  1745. Disclaimer: This is what I think the terms mean.  I may be wrong.
  1746.  
  1747. The two essential pieces of OpenDoc are Editors and Parts.
  1748.  
  1749. A Part is an element which you see on the screen as 'part' of
  1750. a document.  It contains data which can be manipulated or controls.
  1751.  
  1752. A Text Part is a region of text, a picture part is a region which
  1753. contains a picture.  There can also be Clock parts which display
  1754. clocks, button parts, and so-on.
  1755.  
  1756.  
  1757. An Editor is the program which controls how you interact with
  1758. the data and controls in its associated Parts.
  1759.  
  1760. So, when you are typing text into a Text Part, the Text Editor
  1761. has control.  When you are painting in a Picture Part, the Picture
  1762. Editor has control.
  1763.  
  1764.  
  1765. Companies will make and sell Part Editors, just as they sell
  1766. Applications today.  Users will create Parts with those Editors
  1767. just as they create Documents today.
  1768.  
  1769.  
  1770. A Document is a collection of Parts which are all saved together.
  1771. The Document belongs to the Part Editor of the uppermost (outermost)
  1772. Part.  If a user wants to create a document which is primarily Text
  1773. then they will use a Text Part as the base for the Document and when
  1774. the Document is saved it will look like a Text File in the Finder.
  1775.  
  1776.  
  1777. A Container is any Part which can contain other Parts.  Parts are
  1778. said to be Embedded in Containers.  Any Part can be embedded, but
  1779. special coding is required to make a Container Part.
  1780.  
  1781.  
  1782. Applications can also be Containers.  The Application is not a part
  1783. of OpenDoc itself (it cannot be embedded), but it can Contain any
  1784. OpenDoc parts.  In this way, Applications can support OpenDoc without
  1785. much special coding.
  1786.  
  1787.  
  1788. I hope this helps and doesn't sow more confusion.  There is a lot
  1789. more than this to OpenDoc too, BTW.
  1790.  
  1791. [fletcher]
  1792.  
  1793. +++++++++++++++++++++++++++
  1794.  
  1795. >From amfahr@pharos.com (Jeff Amfahr)
  1796. Date: Mon, 04 Dec 1995 10:17:32 -0400
  1797. Organization: Pharos Technologies
  1798.  
  1799. In article <49nn41$8k4@apple.com>, Kerry Ortega <kortega@apple.com> wrote:
  1800. > Document - In OpenDoc, a user-organized collection of parts, all stored
  1801. > together.
  1802. > Part - A portion of a compound document; it consists of document content,
  1803. > plus-at runtime-a part editor that manipulates that content. The content
  1804. > is data of a given structure or type, such as text, graphics, or video;
  1805. > the code is a part editor.
  1806. > Stationery - A part which has the Stationery property set. The only
  1807. > difference between a normal part and a stationery part is in the Open
  1808. > behavior. When you open a normal part, it opens into a window. When you
  1809. > open a stationery part, it creates ("tears off") a new part, saves the
  1810. > copy to disk with a unique name, and opens that copy, leaving the
  1811. > stationery unchanged. Thus stationery is just an accelerator for
  1812. > duplicating an existing part and then opening it. This allows documents
  1813. > containing boiler-plate to be easily used to create new documents. We
  1814. > encourage developers to deliver their parts as stationery pads, since
  1815. > this will prevent accidentally modifying the original.
  1816.  
  1817. One thing looks inconsistent with this set of definitions (and the one on
  1818. http://www.cilabs.org/docs/glossary.html also). The definition of
  1819. Stationery
  1820. is " A part which has the Stationery property set...When you open a normal
  1821. part...". However, it seems as if earlier defs of Document and Part seem
  1822. to indicate that Document is an on-disk item and Part is an in-memory
  1823. item. In fact, the Develop article "The OpenDoc User Experience" makes
  1824. this exact distinction, that parts on disk are always called documents.
  1825. This seem to be at odds with the definition of stationary (which may in
  1826. fact be a collection of parts, since I can make any document a stationary
  1827. document). In addition, to refer to an on disk item as a part seems
  1828. confusing, since it is not possible from looking at to tell if is in fact
  1829. one part or a collection of parts. So, is an on disk representation of a
  1830. part or collection of parts always refereed to as a document? If so, its
  1831. seems like the stationary definition is wrong.
  1832.  
  1833.   Jeff Amfahr
  1834.   Pharos Technologies
  1835.   amfahr@pharos.com
  1836.  
  1837. -- 
  1838. Jeff Amfahr
  1839. amfahr@pharos-tech.com
  1840.  "This isn't right.  This isn't even wrong."
  1841.                                 Wolfgang Pauli
  1842.  
  1843. +++++++++++++++++++++++++++
  1844.  
  1845. >From panic@aztec.co.za (John Anderson)
  1846. Date: 5 Dec 1995 21:17:57 GMT
  1847. Organization: Semiosis Unlimited
  1848.  
  1849. In message <amfahr-0412951017320001@amfahr.pharos.com> - amfahr@pharos.com (Jef
  1850. f Amfahr) writes:
  1851. >
  1852. >In article <49nn41$8k4@apple.com>, Kerry Ortega <kortega@apple.com> wrote:
  1853. >> Document - In OpenDoc, a user-organized collection of parts, all stored
  1854. >> together.
  1855. >> 
  1856. >> Part - A portion of a compound document; it consists of document content,
  1857. >> plus-at runtime-a part editor that manipulates that content. The content
  1858. >> is data of a given structure or type, such as text, graphics, or video;
  1859. >> the code is a part editor.
  1860. >> 
  1861. >> Stationery - A part which has the Stationery property set. The only
  1862. >> difference between a normal part and a stationery part is in the Open
  1863. >> behavior. When you open a normal part, it opens into a window. When you
  1864. >> open a stationery part, it creates ("tears off") a new part, saves the
  1865. >> copy to disk with a unique name, and opens that copy, leaving the
  1866. >> stationery unchanged. Thus stationery is just an accelerator for
  1867. >> duplicating an existing part and then opening it. This allows documents
  1868. >> containing boiler-plate to be easily used to create new documents. We
  1869. >> encourage developers to deliver their parts as stationery pads, since
  1870. >> this will prevent accidentally modifying the original.
  1871. >
  1872. >One thing looks inconsistent with this set of definitions (and the one on
  1873. >http://www.cilabs.org/docs/glossary.html also). The definition of
  1874. >Stationery
  1875. >is " A part which has the Stationery property set...When you open a normal
  1876. >part...". However, it seems as if earlier defs of Document and Part seem
  1877. >to indicate that Document is an on-disk item and Part is an in-memory
  1878. >item. In fact, the Develop article "The OpenDoc User Experience" makes
  1879. >this exact distinction, that parts on disk are always called documents.
  1880. >This seem to be at odds with the definition of stationary (which may in
  1881. >fact be a collection of parts, since I can make any document a stationary
  1882. >document). In addition, to refer to an on disk item as a part seems
  1883. >confusing, since it is not possible from looking at to tell if is in fact
  1884. >one part or a collection of parts. So, is an on disk representation of a
  1885. >part or collection of parts always refereed to as a document? If so, its
  1886. >seems like the stationary definition is wrong.
  1887.  
  1888. I use document to refer to either the Bento file on disk, or the window in 
  1889. which the user works with all the parts.
  1890.  
  1891. I figure that we should actually be using two sets of nomenclature. One for 
  1892. developers and one for users. For a developer, 'part' can refer to several 
  1893. things, depending on the context: a part of a Bento file; a part of an 
  1894. onscreen document when bound with its editor; a part editor when speking 
  1895. loosely, eg "I've just written a neato-nifty RTF part". A user isn't 
  1896. interested in all these distinctions. To quote "The OpenDoc User Experience" 
  1897. (loosely) the user's experienec of OpenDoc should be seamless. So IMHO a 
  1898. part for a user is just the thing that gets a box drawn around it when they 
  1899. click on it.
  1900.  
  1901. One of the problems I have in explaining this to developers who aren't 
  1902. familiar with OpenDoc is that initially people like to have words that only 
  1903. refer to one thing. It's only after we become familiar with the domain that 
  1904. we are able to cope with 'semantic overloading'.
  1905.  
  1906. Phew. All that is at _least_ 0.03 (per hour, thanks)
  1907.  
  1908. bye
  1909. John Anderson
  1910. Absolute Systems
  1911.  
  1912.  
  1913.  
  1914.  
  1915.  
  1916.  
  1917.  
  1918.  
  1919.  
  1920.  
  1921.  
  1922.  
  1923.  
  1924.  
  1925.  
  1926.  
  1927.  
  1928.  
  1929.  
  1930.  
  1931.  
  1932.  
  1933.  
  1934.  
  1935.  
  1936.  
  1937.  
  1938.  
  1939.  
  1940.  
  1941.  
  1942.  
  1943.  
  1944.  
  1945.  
  1946.  
  1947.  
  1948.  
  1949.  
  1950.  
  1951.  
  1952.  
  1953.  
  1954.  
  1955.  
  1956.  
  1957.  
  1958.  
  1959.  
  1960.  
  1961.  
  1962.  
  1963.  
  1964.  
  1965.  
  1966. +++++++++++++++++++++++++++
  1967.  
  1968. >From fms@athena.mit.edu (Fletcher Sandbeck)
  1969. Date: 8 Dec 1995 03:09:21 GMT
  1970. Organization: Massachusetts Institute of Technology
  1971.  
  1972.  
  1973. >The definition of Stationery
  1974. >is " A part which has the Stationery property set...When you open a normal
  1975. >part...". However, it seems as if earlier defs of Document and Part seem
  1976. >to indicate that Document is an on-disk item and Part is an in-memory
  1977. >item. In fact, the Develop article "The OpenDoc User Experience" makes
  1978. >this exact distinction, that parts on disk are always called documents.
  1979. >This seem to be at odds with the definition of stationary (which may in
  1980. >fact be a collection of parts, since I can make any document a stationary
  1981. >document). In addition, to refer to an on disk item as a part seems
  1982. >confusing, since it is not possible from looking at to tell if is in fact
  1983. >one part or a collection of parts. So, is an on disk representation of a
  1984. >part or collection of parts always refereed to as a document? If so, its
  1985. >seems like the stationary definition is wrong.
  1986.  
  1987. Currently on the Mac every Application has a distinct environment,
  1988. there is a Finder environment, a Word environment, and an OpenDoc
  1989. environment.
  1990.  
  1991. The important distinction between Parts and Documents is that on
  1992. a present-day Mac you will not see Parts in the Finder.  Only
  1993. Documents have icons in the Finder.
  1994.  
  1995. When you open a Document from the Finder you enter the OpenDoc
  1996. environment.  At this point the distinction between Parts and
  1997. Documents becomes a bit fuzzy.  A Document is now a collection
  1998. of Parts that you save and open all together.  Any part can
  1999. be saved independently and become a new document.
  2000.  
  2001. Stationery is a kind of Document in the Finder.  When you open
  2002. a piece of Stationery then you end up with a collection of Parts,
  2003. a Document, in the OpenDoc environment.
  2004.  
  2005. I don't think this will be confusing in the end release.  I
  2006. think users will adapt to double clicking Stationery documents
  2007. to create new Documents reasonably quickly.
  2008.  
  2009. [fletcher]
  2010.  
  2011.  
  2012. +++++++++++++++++++++++++++
  2013.  
  2014. >From jaks@netcom.com (Eric Jackson)
  2015. Date: Fri, 1 Dec 1995 18:26:07 GMT
  2016. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  2017.  
  2018. In article <dkkramer-0112950120510001@dialin-1.wustl.edu>,
  2019. Jerry Adlersfluegel <dkkramer@artsci.wustl.edu> wrote:
  2020. >I've been reading all this OpenDoc stuff, and follow it pretty well. (I'm
  2021. >no programmer.) But there's one thing that's kind of bugging me. 
  2022. >
  2023. >It seems people (myself included) are confused about all the terms: part,
  2024. >document, container, editor, etc. Container is used instead of document,
  2025. >editors are called parts, documents are called parts, editors are called
  2026. >containers, and so on. 
  2027. >
  2028. >For all of our sakes, could someone please list the 'real' definitions for
  2029. >the above terms (and whatever I didn't include).
  2030. >
  2031. >I have a pretty good idea of what they all are, but I would like to see
  2032. >them clarified here for everyone.
  2033. >
  2034. >Thanks!
  2035. >
  2036. >-- 
  2037. >Jerry Adlersfluegel                 (from my gf's account because 
  2038. >adlerspj@pxa.slu.edu                     my school's systems bite)
  2039. >                    <<Smilie free zone>>
  2040.  
  2041. Well let me give it a try.
  2042.  
  2043. Part:
  2044.  
  2045. This is an OpenDoc part.  There are two types of parts called editors and
  2046. viewers.  There is another way that OpenDoc parts can differ.  Some parts
  2047. called container parts can have other parts embeded inside of them.
  2048.  
  2049. If you want to see your OpenDoc parts you can look in your Editors folder
  2050. because that is where they live.
  2051.  
  2052. Document:
  2053.  
  2054. A Document is an Icon that lives on top of you desk top.  In the old days there
  2055. was an applicatiion that knew how to open the document.  But now things have
  2056. changed.  A Document now knows how to open inself.  It uses OpenDoc parts
  2057. called editors or viewers to show the data inside of the document.
  2058. Some fancy applications called *Container Applications* can have
  2059. documents that have OpenDoc parts in them.
  2060.  
  2061. Container:
  2062.  
  2063. A container is something that has something inside of it.  Many different
  2064. things can be containers.  For example if your can has a spare tire in
  2065. the trunk it is a spare tire container.  Documents since they can contain
  2066. a part are called containers.  A part that contains another part is also
  2067. a container.  An application that can contain parts is also called a
  2068. container.  I don't think that OpenDoc really changes the definition
  2069. of the word container in any special way, in the sence that the
  2070. meaning of the word part, in the OpenDoc context has been changed.
  2071. If documentation writers wanted to be more clear they could alway
  2072. discribe a container better than just *the container*.
  2073. They could say *the containing part* or *the containing document*
  2074.  
  2075. Editor:  A special type of part that can edit data.  A part that can
  2076. not edit data is called a viewer.  Note that an editor can be a
  2077. container.
  2078.  
  2079. ===============================================================================
  2080. There is one thing that you said that I think is incorrect.
  2081.  
  2082. "Documents are called parts"
  2083.  
  2084. If it looked to you that some documentation said that, its because the
  2085. documentation was incorrect or you did not understand what it was saying
  2086. because it was unclear.
  2087.  
  2088. A document is not a part.  A document can contain a single part but a
  2089. document can not be a part.  You can also put one document into another
  2090. document, in which case one document is *part* of another document.
  2091.  
  2092. But you can't say Document A is *OpenDoc Part* of document B.  This
  2093. would not make sence.  So its unfortunate that the word part now
  2094. has two meanings and you have to read what a documentation writer
  2095. is saying in context.
  2096.  
  2097. Hope that this helps.
  2098.  
  2099. Eric Jackson
  2100. jaks@netcom.com
  2101.  
  2102.  
  2103. ---------------------------
  2104.  
  2105. >From nporcino@sol.uvic.ca (Nick Porcino)
  2106. Subject: Palettes and QuickTime
  2107. Date: 21 Nov 1995 20:32:46 GMT
  2108. Organization: Planet IX
  2109.  
  2110.  
  2111. Hi all, I'm having a major problem with Palettes and QuickTime.
  2112. I'm porting The Riddle of Master Lu from DOS to Mac, and am just about
  2113. done, except! I'm trying to use QuickTime to play back certain animations,
  2114. and I just can't seem to do it.
  2115.  
  2116. Because our art is already palettized, I have to initialize the palette
  2117. like this:
  2118.  
  2119.    // steal the device's color table
  2120.    CTabHandle gFade = (*(*hGD)->gdPMap)->pmTable;
  2121.    HLock((Handle)gFade);
  2122.    gamePalette = NewPalette(256, gFade, pmAnimated+pmTolerant+pmExplicit,
  2123. 0x0000);
  2124.    SetPalette(gameWindow->GetWindow(), gamePalette, TRUE);
  2125.    gr_pal_system_init(gFade);
  2126.  
  2127. Then, I set up the palette like this (once in every scene, as every scene
  2128. has a unique
  2129. palette).
  2130.  
  2131. void gr_pal_set_range(RGB8* pal, int first_color, int num_colors)
  2132. {
  2133.    int i, last_color;
  2134.  
  2135.    last_color = first_color + num_colors;
  2136.  
  2137.    for (i=first_color; i<last_color; i++)
  2138.    {
  2139.       (*gFadeCtab)->ctTable[i].rgb.red = (short)(pal[i].r)<<8; // 8 bit
  2140. color values
  2141.       (*gFadeCtab)->ctTable[i].rgb.green = (short)(pal[i].g)<<8;
  2142.       (*gFadeCtab)->ctTable[i].rgb.blue = (short)(pal[i].b)<<8;
  2143.    }
  2144.    AnimatePalette(gameWindow->GetWindow(), gFadeCtab, first_color,
  2145. first_color, num_colors);
  2146. }
  2147.  
  2148. This works fine, except when I try to play QuickTime movies - despite the fact
  2149. that the palette in the hardware and the color in the movie are 1:1 identical,
  2150. the movie gets dithered to black and white.
  2151.  
  2152. I can find nothing in the QuickTime API or documentation to help.
  2153.  
  2154. HELP!!!!!!
  2155.  
  2156. - Nick Porcino
  2157. Sanctuary Woods, Victoria
  2158. Lead Engine Guy
  2159.  
  2160. +++++++++++++++++++++++++++
  2161.  
  2162. >From jmunkki@beta.hut.fi (Juri Munkki)
  2163. Date: 23 Nov 1995 14:58:44 GMT
  2164. Organization: Helsinki University of Technology
  2165.  
  2166. In article <nporcino-2111951131510001@204.239.240.138> nporcino@sol.uvic.ca (Nick Porcino) writes:
  2167. >This works fine, except when I try to play QuickTime movies - despite the fact
  2168. >that the palette in the hardware and the color in the movie are 1:1 identical,
  2169. >the movie gets dithered to black and white.
  2170.  
  2171. You used AnimatePalette and animated palette entries. This effectively hides
  2172. the colors from QuickTime, since animated colors are reserved and can only
  2173. be used through palette manager calls.
  2174.  
  2175. -- 
  2176. Juri Munkki jmunkki@iki.fi      In cyberspace everyone can hear you scream.
  2177. http://www.iki.fi/~jmunkki              Windsurfing: Faster than the wind.
  2178.  
  2179. +++++++++++++++++++++++++++
  2180.  
  2181. >From zzkbergm@dingo.uq.edu.au (Christoph Bergmann)
  2182. Date: Sun, 26 Nov 1995 11:43:55 +1000
  2183. Organization: University of Queensland
  2184.  
  2185. In article <nporcino-2111951131510001@204.239.240.138>,
  2186. nporcino@sol.uvic.ca (Nick Porcino) wrote:
  2187.  
  2188. <snip>
  2189.  
  2190. > This works fine, except when I try to play QuickTime movies - despite the fact
  2191. > that the palette in the hardware and the color in the movie are 1:1 identical,
  2192. > the movie gets dithered to black and white.
  2193. > I can find nothing in the QuickTime API or documentation to help.
  2194. > HELP!!!!!!
  2195.  
  2196. try setting ctseed for the movie to = ctseed for the window.
  2197. this will fool quickdraw into thinking they are direct clones (even if
  2198. they were different)
  2199.  
  2200. hope this helps,
  2201. ChrisB
  2202.  
  2203. +++++++++++++++++++++++++++
  2204.  
  2205. >From dalawren@netcom.com (David Lawrence)
  2206. Date: Wed, 29 Nov 1995 07:44:08 GMT
  2207. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  2208.  
  2209. In article <nporcino-2111951131510001@204.239.240.138>,
  2210. nporcino@sol.uvic.ca (Nick Porcino) wrote:
  2211.  
  2212. > Hi all, I'm having a major problem with Palettes and QuickTime.
  2213. > I'm porting The Riddle of Master Lu from DOS to Mac, and am just about
  2214. > done, except! I'm trying to use QuickTime to play back certain animations,
  2215. > and I just can't seem to do it.
  2216.  
  2217.  
  2218.  
  2219. If you must use an animating palette, you can play a movie into a GWorld,
  2220. then copy each frame of the movie to the window.  We did this in
  2221. Warcraft's intro movies so we could fade a movie out while it was
  2222. playing.  I'm not looking at the code right now, but I think I remember
  2223. how I did it.  Here it goes:
  2224.  
  2225. Create a GWorld with the same color table that you are using elsewhere. 
  2226. But you must set bit 14 of the color table's ctFlags field while
  2227. CopyBits'ing.  With this bit set, when you copy from the GWorld, the
  2228. colors are not remapped to the window's non-animated colors.  Always
  2229. leaving bit 14 set should be harmless.
  2230.  
  2231. Attach your animated palette to the GWorld with SetPalette (yes, this is
  2232. legal, with appropriate casting).  This ensures that QuickTime plays the
  2233. movie using the correct colors.  Set up the movie to play into the GWorld
  2234. (SetMovieGWorld I believe).  Set up a callback routine to CopyBits the
  2235. frames from the GWorld to the window after each frame is completed.  There
  2236. is sample code that uses these callback routines in the QuickTime sample
  2237. code at:
  2238.  
  2239. <http://www.info.apple.com/dev/devinfo/quicktime/dtsqtutils.html>
  2240.  
  2241.  
  2242. I think all this is correct.  If it doesn't work, let me know and I'll
  2243. look in the code to see exactly what I did before. (Good thing I commented
  2244. my code.)
  2245.  
  2246.  
  2247. By the way, I looked for a way to force a movie to play directly into a
  2248. window that is using animated colors, but with no luck.  If anyone knows
  2249. of a way, please let me know.
  2250.  
  2251.  
  2252.     David Lawrence
  2253.     Future Tense
  2254.  
  2255. ---------------------------
  2256.  
  2257. >From nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger)
  2258. Subject: Passing a member function to DeviceLoop?
  2259. Date: Tue, 14 Nov 1995 12:15:04 +1300
  2260. Organization: Dept. of Information Science, University of Otago
  2261.  
  2262. Hi, here's an intersting problem. I'm converting a project from CW Object
  2263. Pascal to CW C++, and I've hit a slight snag with DeviceLoop routines. I
  2264. want to make my DeviceLoop routines member functions of a class, and set
  2265. up static UPPs to them so I can get at them. In other words, I ideally
  2266. want something like this:
  2267.  
  2268. NItem.h:
  2269.  
  2270. class NItem
  2271. {
  2272.   public:
  2273.       ...
  2274.     void Draw(); // this calls DeviceLoop
  2275.       ...
  2276.   private:
  2277.     static DeviceLoopDrawingUPP gPaintGray; // this will point to PaintGray()
  2278.     pascal void PaintGray(short, short, GDHandle, long);
  2279. };
  2280.  
  2281. (I'm going use CW's inherited:: extension, so it's OK for them to be
  2282. private, I think...) Now, in NItem.cp, I tried this:
  2283.  
  2284. ...
  2285. DeviceLoopDrawingUPP NItem::gPaintGray =
  2286. NewDeviceLoopDrawingProc(&NItem::PaintGray);
  2287. ...
  2288.  
  2289. Argh, boom, splat. I get a complaint about an illegal explicit conversion
  2290. from one function pointer type to another. Presumably this is because of
  2291. the implicit parameters that get passed to every member function. That's
  2292. what it looks like anyway (forgive if I'm speaking utter crap, I'm
  2293. relatively new to C++ :)
  2294.  
  2295. I tried using NewDeviceLoopDrawingProc(&NItem::PaintGray()) and got told
  2296. the definition didn't match the prototype. So I also tried
  2297. NewDeviceLoopDrawingProc(&NItem::PaintGray(short,short,GDHandle,long)),
  2298. which totally bamboozled the compiler :)
  2299.  
  2300. Has anyone successfully done this? Or is it impossible? I remember when I
  2301. first started writing this in THINK Pascal I hit a similar problem, but
  2302. couldn't get around it because you couldn't take the @ of a member
  2303. function :( The same thing obviously doesn't apply here, but coercing it
  2304. into something that both DeviceLoop and the compiler can understand seems
  2305. to be a non-trivial exercise.
  2306.  
  2307. =====================================================================
  2308. Nigel Stanger,           Internet: nigel.stanger@stonebow.otago.ac.nz
  2309. University of Otago,     Phone: +64 3 479-8179
  2310. Dunedin, NEW ZEALAND.    Fax:   +64 3 479-8311
  2311.  
  2312. +++++++++++++++++++++++++++
  2313.  
  2314. >From pottier@drakkar.ens.fr (Francois Pottier)
  2315. Date: 14 Nov 1995 10:14:38 GMT
  2316. Organization: Ecole Normale Superieure, Paris
  2317.  
  2318. In article <nigel.stanger-1411951215040001@ou176027.otago.ac.nz>,
  2319. Nigel Stanger <nigel.stanger@stonebow.otago.ac.nz> wrote:
  2320.  
  2321. >Argh, boom, splat. I get a complaint about an illegal explicit conversion
  2322. >from one function pointer type to another. Presumably this is because of
  2323. >the implicit parameters that get passed to every member function.
  2324.  
  2325. You're right. If you were allowed to use a member function, DeviceLoop
  2326. wouldn't know that it expects an additional parameter, so it would
  2327. call with wrong arguments and the world would end in a horrible crash.
  2328. So, the type-checker just saved your life :-)
  2329.  
  2330. >Has anyone successfully done this? Or is it impossible?
  2331.  
  2332. It's impossible to pass a member function to DeviceLoop. I can think of
  2333. several ways to get around this:
  2334.  
  2335. - Make your PaintGray function static, so that it doesn't require an
  2336.   implicit parameter, and use static private variables to pass data to
  2337.   it (very dirty).
  2338.  
  2339. - Alternatively, make PaintGray static and use DeviceLoop's userData
  2340.   parameter to pass data to it (slightly less dirty). That's what userData
  2341.   was invented for.
  2342.  
  2343. - Finally, a nice way is to not use DeviceLoop at all. If you have CodeWarrior,
  2344.   look at the StDeviceLoop class inside PowerPlant's code. It does the job for
  2345.   you and allows you to write all of your stuff in one place without any headaches.
  2346.   The only problem with this approach is that it bypasses DeviceLoop, so if
  2347.   Apple improves DeviceLoop, your code won't benefit from it. On the other hand,
  2348.   this approach works with non-color QD Macs, whereas DeviceLoop doesn't.
  2349.  
  2350. Hope this helps,
  2351.  
  2352. -- 
  2353. Francois
  2354. pottier@dmi.ens.fr
  2355. http://www.eleves.ens.fr:8080/home/pottier/
  2356.  
  2357. +++++++++++++++++++++++++++
  2358.  
  2359. >From isis@netcom.com (Mike Cohen)
  2360. Date: Tue, 14 Nov 1995 18:57:29 GMT
  2361. Organization: ISIS International
  2362.  
  2363. In article <nigel.stanger-1411951215040001@ou176027.otago.ac.nz>,
  2364. nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger) wrote:
  2365.  
  2366. >Hi, here's an intersting problem. I'm converting a project from CW Object
  2367. >Pascal to CW C++, and I've hit a slight snag with DeviceLoop routines. I
  2368. >want to make my DeviceLoop routines member functions of a class, and set
  2369. >up static UPPs to them so I can get at them. In other words, I ideally
  2370. >want something like this:
  2371. >
  2372. [SNIP]
  2373. >
  2374. >Has anyone successfully done this? Or is it impossible? I remember when I
  2375. >first started writing this in THINK Pascal I hit a similar problem, but
  2376. >couldn't get around it because you couldn't take the @ of a member
  2377. >function :( The same thing obviously doesn't apply here, but coercing it
  2378. >into something that both DeviceLoop and the compiler can understand seems
  2379. >to be a non-trivial exercise.
  2380.  
  2381. You can't pass a non-static member function for ANY toolbox callbox
  2382. function. When a member function is called, it's passed a hidden "self"
  2383. argument, which won't work for toolbox callbacks. You can pass a static
  2384. member function, which can access any other static members, but doesn't
  2385. have a "self" instance defined.
  2386.  
  2387.  
  2388. --
  2389. Mike Cohen - isis@netcom.com
  2390. Home page: http://www.isis-intl.com/
  2391. Sound is the same for all the world - Youssou N'dour, "Eyes Open"
  2392.  
  2393. +++++++++++++++++++++++++++
  2394.  
  2395. >From skevill@tartarus.uwa.edu.au (Scott Kevill)
  2396. Date: Thu, 16 Nov 1995 15:29:22 +0800
  2397. Organization: The University of Western Australia
  2398.  
  2399. In article <489q6e$c8b@nef.ens.fr>, pottier@drakkar.ens.fr (Francois
  2400. Pottier) wrote:
  2401.  
  2402. : In article <nigel.stanger-1411951215040001@ou176027.otago.ac.nz>,
  2403. : Nigel Stanger <nigel.stanger@stonebow.otago.ac.nz> wrote:
  2404. : >Argh, boom, splat. I get a complaint about an illegal explicit conversion
  2405. : >from one function pointer type to another. Presumably this is because of
  2406. : >the implicit parameters that get passed to every member function.
  2407. : You're right. If you were allowed to use a member function, DeviceLoop
  2408. : wouldn't know that it expects an additional parameter, so it would
  2409. : call with wrong arguments and the world would end in a horrible crash.
  2410. : So, the type-checker just saved your life :-)
  2411. : >Has anyone successfully done this? Or is it impossible?
  2412. : It's impossible to pass a member function to DeviceLoop. I can think of
  2413. : several ways to get around this:
  2414. : - Make your PaintGray function static, so that it doesn't require an
  2415. :   implicit parameter, and use static private variables to pass data to
  2416. :   it (very dirty).
  2417. : - Alternatively, make PaintGray static and use DeviceLoop's userData
  2418. :   parameter to pass data to it (slightly less dirty). That's what userData
  2419. :   was invented for.
  2420. : - Finally, a nice way is to not use DeviceLoop at all. If you have
  2421. CodeWarrior,
  2422. :   look at the StDeviceLoop class inside PowerPlant's code. It does the job for
  2423. :   you and allows you to write all of your stuff in one place without any
  2424. headaches.
  2425. :   The only problem with this approach is that it bypasses DeviceLoop, so if
  2426. :   Apple improves DeviceLoop, your code won't benefit from it. On the
  2427. other hand,
  2428. :   this approach works with non-color QD Macs, whereas DeviceLoop doesn't.
  2429.  
  2430. I encountered this problem recently when I was adding multiple monitor
  2431. support for my Dialog Manager replacement code. I came up with a simple
  2432. and effective solution.
  2433.  
  2434. Each item had two methods Draw and DrawDepth.
  2435.     void DrawDepth(short depth, Boolean isGray);
  2436.     void Draw(void);
  2437.  
  2438. If an item needed to draw in colour it would do something like this:
  2439.  
  2440. void TDialogItem::DrawDepth(short depth, Boolean isGray)
  2441. {
  2442.    ......
  2443. }
  2444.  
  2445. void TDialogItem::Draw(void)
  2446. {
  2447.    DeviceLoop(itsDlog->macWindow->visRgn, DepthProc, (long) this, 0);
  2448. }
  2449.  
  2450. static pascal void DepthProc(short depth, short flags, GDHandle dev, long data)
  2451. {
  2452.     ((TDialogItem *) data)->DrawDepth(depth, !(flags & gdDevType));
  2453. }
  2454.  
  2455. There would just be one DepthProc that all the items would use.
  2456.  
  2457. Hope this helps,
  2458.  
  2459. Scott Kevill.
  2460. skevill@tartarus.uwa.edu.au
  2461.  
  2462. +++++++++++++++++++++++++++
  2463.  
  2464. >From jordanz@altura.com (Jordan Zimmerman)
  2465. Date: Thu, 16 Nov 1995 09:19:25 -0900
  2466. Organization: Altura Software, Inc.
  2467.  
  2468. In article <nigel.stanger-1411951215040001@ou176027.otago.ac.nz>,
  2469. nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger) wrote:
  2470.  
  2471. > Hi, here's an intersting problem. I'm converting a project from CW Object
  2472. > Pascal to CW C++, and I've hit a slight snag with DeviceLoop routines. I
  2473. > want to make my DeviceLoop routines member functions of a class, and set
  2474. > up static UPPs to them so I can get at them. In other words, I ideally
  2475. > want something like this:
  2476. [snip] 
  2477.  
  2478. You cannot pass a class member function pointer in place of a standard
  2479. function pointer. The way to do this is with a static member function that
  2480. is a wrapper around the class member function.
  2481.  
  2482. So:
  2483.  
  2484. class my_class
  2485. {
  2486.     ...   
  2487.     void            my_member_func(void);
  2488.     static void     my_wrapper(void* user_ptr);
  2489. };
  2490.  
  2491.     ...
  2492.     SomeFuncThatTakesACallbackAndUserPtr(&my_class::my_wrapper, (void*)this);
  2493.     ...
  2494.  
  2495. void my_class::my_wrapper(void* user_ptr)
  2496. {
  2497.     my_class*   class_ptr = (my_class*)user_ptr;
  2498.     class_ptr->my_member_func();
  2499. };
  2500.  
  2501. -- 
  2502. Jordan Zimmerman, Altura Software
  2503. home page: http://www.altura.com/jordanz
  2504. Spock's Beard: http://www.altura.com/spocks_beard
  2505.  
  2506. +++++++++++++++++++++++++++
  2507.  
  2508. >From nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger)
  2509. Date: Fri, 17 Nov 1995 13:51:10 +1300
  2510. Organization: Dept. of Information Science, University of Otago
  2511.  
  2512. In article <ACCE34A99668B8ED4@10.0.2.15>, isis@netcom.com (Mike Cohen) wrote:
  2513. > You can't pass a non-static member function for ANY toolbox callbox
  2514. > function. When a member function is called, it's passed a hidden "self"
  2515. > argument, which won't work for toolbox callbacks.
  2516.  
  2517. I thought as much...
  2518.  
  2519. > You can pass a static
  2520. > member function, which can access any other static members, but doesn't
  2521. > have a "self" instance defined.
  2522.  
  2523. Aha, yes! That would do it. Making the routines static would actually also
  2524. make sense in this case too. I can see I still have quite a bit to learn
  2525. about C++ :)
  2526.  
  2527. Thanks! I'll try this out tonight.
  2528.  
  2529. =====================================================================
  2530. Nigel Stanger,           Internet: nigel.stanger@stonebow.otago.ac.nz
  2531. University of Otago,     Phone: +64 3 479-8179
  2532. Dunedin, NEW ZEALAND.    Fax:   +64 3 479-8311
  2533.  
  2534. +++++++++++++++++++++++++++
  2535.  
  2536. >From mouser@zercom.net (Martin-Gilles Lavoie)
  2537. Date: Fri, 17 Nov 1995 14:17:32 -0500
  2538. Organization: ZERCOM Technologies Inc.
  2539.  
  2540. In article <ACCE34A99668B8ED4@10.0.2.15>, isis@netcom.com (Mike Cohen) wrote:
  2541.  
  2542. > In article <nigel.stanger-1411951215040001@ou176027.otago.ac.nz>,
  2543. > nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger) wrote:
  2544. > >Hi, here's an intersting problem. I'm converting a project from CW Object
  2545. > >Pascal to CW C++, and I've hit a slight snag with DeviceLoop routines. I
  2546. > >want to make my DeviceLoop routines member functions of a class, and set
  2547. > >up static UPPs to them so I can get at them. In other words, I ideally
  2548. > >want something like this:
  2549. > >
  2550. > [SNIP]
  2551. > >
  2552. > >Has anyone successfully done this? Or is it impossible? I remember when I
  2553. > >first started writing this in THINK Pascal I hit a similar problem, but
  2554. > >couldn't get around it because you couldn't take the @ of a member
  2555. > >function :( The same thing obviously doesn't apply here, but coercing it
  2556. > >into something that both DeviceLoop and the compiler can understand seems
  2557. > >to be a non-trivial exercise.
  2558. > You can't pass a non-static member function for ANY toolbox callbox
  2559. > function. When a member function is called, it's passed a hidden "self"
  2560. > argument, which won't work for toolbox callbacks. You can pass a static
  2561. > member function, which can access any other static members, but doesn't
  2562. > have a "self" instance defined.
  2563.  
  2564. Better yet, declare a function declares as extern "C",, and make that
  2565. function call your desired method.  Sinple, and youstill get to use your
  2566. self ;-)
  2567.  
  2568. Martin-Gilles Lavoie
  2569. - -------------------------------------------------------------------
  2570. No!...try not.  Do, or do not.  There is no try.
  2571.     --Yoda on error handling.
  2572.  
  2573. Wars does not make one great.
  2574.     --Yoda on "Great Warrior"
  2575.  
  2576. +++++++++++++++++++++++++++
  2577.  
  2578. >From nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger)
  2579. Date: Wed, 29 Nov 1995 13:34:41 +1300
  2580. Organization: Dept. of Information Science, University of Otago
  2581.  
  2582. In article <skevill-1611951529220001@s187.dialup.uwa.edu.au>,
  2583. skevill@tartarus.uwa.edu.au (Scott Kevill) wrote:
  2584. [...]
  2585. > If an item needed to draw in colour it would do something like this:
  2586. {...code snipped...]
  2587. > There would just be one DepthProc that all the items would use.
  2588.  
  2589. That's basically what I ended up doing, except I made my PaintGray routine
  2590. a static member function. In my Draw routine I coerce this to a long and
  2591. pass it to DeviceLoop in the userData parameter, then coerce it back
  2592. within PaintGray. Don't know if it works yet because I haven't finished
  2593. converting the rest of the code yet :) 
  2594.  
  2595. Interestingly enough, that's exactly how I did it in the original Pascal
  2596. (except that PaintGray wasn't a member function), and it worked fine...
  2597.  
  2598. =====================================================================
  2599. Nigel Stanger,           Internet: nigel.stanger@stonebow.otago.ac.nz
  2600. University of Otago,     Phone: +64 3 479-8179
  2601. Dunedin, NEW ZEALAND.    Fax:   +64 3 479-8311
  2602.  
  2603. ---------------------------
  2604.  
  2605. >From tah92@ecs.soton.ac.uk (Thomas Haggie)
  2606. Subject: Question: Do you need to lock a Sound Handle before SndPlay
  2607. Date: 30 Nov 1995 15:52:00 GMT
  2608. Organization: Electronics and Computer Science, University of Southampton
  2609.  
  2610. I was wondering, I need to play sounds, do you need to lock a sound
  2611. handle before calling SndPlay with it? Also what happens if you call
  2612. release resource on the SndHandle before it has finnished playing?
  2613.  
  2614.                                         -*TOM*-
  2615.  
  2616. +++++++++++++++++++++++++++
  2617.  
  2618. >From "Andrew C. Plotkin" <erkyrath+@CMU.EDU>
  2619. Date: Thu, 30 Nov 1995 13:13:35 -0500
  2620. Organization: Carnegie Mellon, Pittsburgh, PA
  2621.  
  2622. tah92@ecs.soton.ac.uk (Thomas Haggie) writes:
  2623. > I was wondering, I need to play sounds, do you need to lock a sound
  2624. > handle before calling SndPlay with it?
  2625.  
  2626. Yes. Think about it: SndPlay takes a pointer, not a handle, so the
  2627. system has no way of calling HLock on it. And a pointer to the
  2628. contents of a handle can become invalid whenever memory is moved or
  2629. allocated. So if you leave it unlocked, there's a pretty good chance
  2630. that the sound will turn into a horrific screech halfway through.
  2631.  
  2632. > Also what happens if you call
  2633. > release resource on the SndHandle before it has finnished playing?
  2634.  
  2635. Same thing. Nothing will happen right away, because ReleaseResource
  2636. doesn't actually clear out the memory it releases. But the next time
  2637. you move memory, something new will be written into the memory that
  2638. the Sound Manager is reading, and you're back to the horrible screech.
  2639.  
  2640. --Z
  2641.  
  2642. "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the borogoves..."
  2643.  
  2644. +++++++++++++++++++++++++++
  2645.  
  2646. >From skevill@tartarus.uwa.edu.au (Scott Kevill)
  2647. Date: Fri, 01 Dec 1995 14:33:02 +0800
  2648. Organization: The University of Western Australia
  2649.  
  2650. In article <0kjTFDu00WB39KVEZ0@andrew.cmu.edu>, "Andrew C. Plotkin"
  2651. <erkyrath+@CMU.EDU> wrote:
  2652.  
  2653. : tah92@ecs.soton.ac.uk (Thomas Haggie) writes:
  2654. : > I was wondering, I need to play sounds, do you need to lock a sound
  2655. : > handle before calling SndPlay with it?
  2656. : Yes. Think about it: SndPlay takes a pointer, not a handle, so the
  2657. : system has no way of calling HLock on it. And a pointer to the
  2658. : contents of a handle can become invalid whenever memory is moved or
  2659. : allocated. So if you leave it unlocked, there's a pretty good chance
  2660. : that the sound will turn into a horrific screech halfway through.
  2661.  
  2662. Sorry, SndPlay() *does* take a handle to the sound. It takes a pointer to
  2663. a sound channel. From what I've seen with other code, the handle doesn't
  2664. need to be locked, but it's probably a good idea to do it anyway.
  2665.  
  2666. : > Also what happens if you call
  2667. : > release resource on the SndHandle before it has finnished playing?
  2668. : Same thing. Nothing will happen right away, because ReleaseResource
  2669. : doesn't actually clear out the memory it releases. But the next time
  2670. : you move memory, something new will be written into the memory that
  2671. : the Sound Manager is reading, and you're back to the horrible screech.
  2672.  
  2673. SndPlay() itself moves memory so you could be in for problems. If you want
  2674. to release the resource after the sound has played, either play it
  2675. synchronously, then release it, or create a sound channel with
  2676. SndNewChannel() with a callback procedure. This procedure will be called
  2677. when the sound has finished playing, but you can't release the resource in
  2678. that procedure because it is called at interrupt time, so set a global
  2679. flag and keep checking that in the rest of your application. That's kind
  2680. of a long winded method, so there might be an easier way of doing it that
  2681. I can't think of at the moment.
  2682. : --Z
  2683. : "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the
  2684. borogoves..."
  2685.  
  2686. Hope this helps,
  2687.  
  2688. Scott Kevill.
  2689. skevill@tartarus.uwa.edu.au
  2690.  
  2691. +++++++++++++++++++++++++++
  2692.  
  2693. >From catambay#m#bill@mmac.is.lmsc.lockheed.com (Bill the Cat)
  2694. Date: 1 Dec 1995 15:22:26 GMT
  2695. Organization: MacPascal Mailing List
  2696.  
  2697. In article <skevill-0112951433020001@s187.dialup.uwa.edu.au>,
  2698. skevill@tartarus.uwa.edu.au (Scott Kevill) wrote:
  2699.  
  2700. > In article <0kjTFDu00WB39KVEZ0@andrew.cmu.edu>, "Andrew C. Plotkin"
  2701. > <erkyrath+@CMU.EDU> wrote:
  2702. > : > Also what happens if you call
  2703. > : > release resource on the SndHandle before it has finnished playing?
  2704. > : 
  2705. > : Same thing. Nothing will happen right away, because ReleaseResource
  2706. > : doesn't actually clear out the memory it releases. But the next time
  2707. > : you move memory, something new will be written into the memory that
  2708. > : the Sound Manager is reading, and you're back to the horrible screech.
  2709. > SndPlay() itself moves memory so you could be in for problems. If you want
  2710. > to release the resource after the sound has played, either play it
  2711. > synchronously, then release it, or create a sound channel with
  2712. > SndNewChannel() with a callback procedure. This procedure will be called
  2713. > when the sound has finished playing, but you can't release the resource in
  2714. > that procedure because it is called at interrupt time, so set a global
  2715. > flag and keep checking that in the rest of your application. That's kind
  2716. > of a long winded method, so there might be an easier way of doing it that
  2717. > I can't think of at the moment.
  2718.  
  2719. You can also skip the callback procedure, but still play it async and use
  2720. the sndchannelstatus function to query the channel to determine if the
  2721. sound has stop playing or not.  Doing it this way takes a bit more cpu
  2722. then using a global and a callback routine, but for simple situations, you
  2723. don't notice the difference.
  2724.  
  2725. _____________________________________________________________________
  2726. Bill Catambay
  2727. Pascal Programmer on Macintosh and Open VMS
  2728.  
  2729.               />
  2730.              //   The purpose of software engineering  
  2731.      (//////[O]>=========================================-
  2732.              \\    is to manage complexity, not to create it.
  2733.               \>
  2734.  
  2735. ____________________________________________________________________
  2736.         
  2737. +++++++++++++++++++++++++++
  2738.  
  2739. >From "Andrew C. Plotkin" <erkyrath+@CMU.EDU>
  2740. Date: Fri,  1 Dec 1995 11:50:35 -0500
  2741. Organization: Carnegie Mellon, Pittsburgh, PA
  2742.  
  2743. skevill@tartarus.uwa.edu.au (Scott Kevill) writes:
  2744. > In article <0kjTFDu00WB39KVEZ0@andrew.cmu.edu>, "Andrew C. Plotkin"
  2745. > <erkyrath+@CMU.EDU> wrote:
  2746. > : Yes. Think about it: SndPlay takes a pointer, not a handle, so the
  2747. > : system has no way of calling HLock on it. And a pointer to the
  2748. > : contents of a handle can become invalid whenever memory is moved or
  2749. > : allocated. So if you leave it unlocked, there's a pretty good chance
  2750. > : that the sound will turn into a horrific screech halfway through.
  2751. > Sorry, SndPlay() *does* take a handle to the sound. It takes a pointer to
  2752. > a sound channel. From what I've seen with other code, the handle doesn't
  2753. > need to be locked, but it's probably a good idea to do it anyway.
  2754.  
  2755. Does it? Oh, look, it does. I wonder what the hell I was thinking.
  2756.  
  2757. Sorry.
  2758.  
  2759. Anyway, the point stands. Lock sounds before playing.
  2760.  
  2761. > If you want
  2762. > to release the resource after the sound has played, either play it
  2763. > synchronously, then release it, or create a sound channel with
  2764. > SndNewChannel() with a callback procedure. This procedure will be called
  2765. > when the sound has finished playing, but you can't release the resource in
  2766. > that procedure because it is called at interrupt time, so set a global
  2767. > flag and keep checking that in the rest of your application. That's kind
  2768. > of a long winded method, so there might be an easier way of doing it that
  2769. > I can't think of at the moment.
  2770.  
  2771. That's the only way I know of.
  2772.  
  2773. --Z
  2774.  
  2775. "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the borogoves..."
  2776.  
  2777. +++++++++++++++++++++++++++
  2778.  
  2779. >From jim_reekes@quickmail.apple.com (Jim Reekes)
  2780. Date: Fri, 01 Dec 1995 19:13:15 -0800
  2781. Organization: Apple Computer, Inc.
  2782.  
  2783. In article <0kjTFDu00WB39KVEZ0@andrew.cmu.edu>, "Andrew C. Plotkin"
  2784. <erkyrath+@CMU.EDU> wrote:
  2785.  
  2786. > tah92@ecs.soton.ac.uk (Thomas Haggie) writes:
  2787. > > I was wondering, I need to play sounds, do you need to lock a sound
  2788. > > handle before calling SndPlay with it?
  2789. > Yes. Think about it: SndPlay takes a pointer, not a handle, so the
  2790. > system has no way of calling HLock on it. And a pointer to the
  2791. > contents of a handle can become invalid whenever memory is moved or
  2792. > allocated. So if you leave it unlocked, there's a pretty good chance
  2793. > that the sound will turn into a horrific screech halfway through.
  2794.  
  2795. No. SndPlay() takes a handle. If you play it asynchronously then you need
  2796. to lock it. The function will lock for the duration of the function, but
  2797. restores its state before returning to the caller. So if you play it
  2798. synchronously you do not need to worry. It's only when play asynchronously
  2799. that it has to be lock by the caller.
  2800.  
  2801. -- 
  2802. Jim Reekes, Polterzeitgeist |       QuickTime Products R&D
  2803.                             |        Sound Manager Expert
  2804. Apple Computer, Inc.        | "All opinions expressed are mine, and
  2805. 2 Infinite Loop  MS 302-3KS |  do not necessarily represent those
  2806. Cupertino, CA 95014         |  of my employer, Apple Computer Inc."
  2807.  
  2808. +++++++++++++++++++++++++++
  2809.  
  2810. >From jayfar@netaxs.com (Jay Farrell)
  2811. Date: Fri, 01 Dec 1995 17:53:55 -0500
  2812. Organization: Jayfar's Web
  2813.  
  2814. In article <skevill-0112951433020001@s187.dialup.uwa.edu.au>,
  2815. skevill@tartarus.uwa.edu.au (Scott Kevill) wrote:
  2816.  
  2817. | In article <0kjTFDu00WB39KVEZ0@andrew.cmu.edu>, "Andrew C. Plotkin"
  2818. | <erkyrath+@CMU.EDU> wrote:
  2819. | : tah92@ecs.soton.ac.uk (Thomas Haggie) writes:
  2820. | : > I was wondering, I need to play sounds, do you need to lock a sound
  2821. | : > handle before calling SndPlay with it?
  2822. | : 
  2823. | : Yes. Think about it: SndPlay takes a pointer, not a handle, so the
  2824. | : system has no way of calling HLock on it. And a pointer to the
  2825. | : contents of a handle can become invalid whenever memory is moved or
  2826. | : allocated. So if you leave it unlocked, there's a pretty good chance
  2827. | : that the sound will turn into a horrific screech halfway through.
  2828. | : 
  2829. | Sorry, SndPlay() *does* take a handle to the sound. It takes a pointer to
  2830. | a sound channel. From what I've seen with other code, the handle doesn't
  2831. | need to be locked, but it's probably a good idea to do it anyway.
  2832. | : > Also what happens if you call
  2833. | : > release resource on the SndHandle before it has finnished playing?
  2834. | : 
  2835. | : Same thing. Nothing will happen right away, because ReleaseResource
  2836. | : doesn't actually clear out the memory it releases. But the next time
  2837. | : you move memory, something new will be written into the memory that
  2838. | : the Sound Manager is reading, and you're back to the horrible screech.
  2839. | SndPlay() itself moves memory so you could be in for problems. If you want
  2840. | to release the resource after the sound has played, either play it
  2841. | synchronously, then release it, or create a sound channel with
  2842. | SndNewChannel() with a callback procedure. This procedure will be called
  2843. | when the sound has finished playing, but you can't release the resource in
  2844. | that procedure because it is called at interrupt time, so set a global
  2845. | flag and keep checking that in the rest of your application. That's kind
  2846. | of a long winded method, so there might be an easier way of doing it that
  2847. | I can't think of at the moment.
  2848.  
  2849. Hmm.  I wonder if Apple's own Menu Clock is guilty of not doing this
  2850. correctly, perhaps not locking the handle or releasing the resource?  When
  2851. I set the clock to chime the hour/half-hour, if I use a sound of a few
  2852. seconds in duration the sound frequently breaks up screechingly part ways
  2853. through.  I've experienced this with System 7.5.1 (not sure about 7.5, as
  2854. I was using different clock s.w. then) with Sound Manager 3.0 & 3.1 on
  2855. both a Quadra 605 and on a Performa PPC 6115.
  2856.  
  2857. Cheers,
  2858. Jayfar
  2859.  
  2860.    ////~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~////
  2861.   ////   The Mops Page    <URL:http://www.netaxs.com/~jayfar/mops.html>    ////
  2862.  ////~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~////
  2863. ////   Mops is Mike Hore's freeware Forth/Smalltalk hybrid for Macintosh ////
  2864. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  2865.   Jay Farrell     jayfar@netaxs.com        Philadelphia, Pennsylvania, USA
  2866.  
  2867. ---------------------------
  2868.  
  2869. >From ianchan@iti.gov.sg (Ian Chan)
  2870. Subject: What's in a stack frame?
  2871. Date: Mon, 27 Nov 1995 12:20:10 GMT
  2872. Organization: Information Technology Institute
  2873.  
  2874. Hi,
  2875.  
  2876.   I'm learning to program on a Mac, and am writing a maze-generator/solver
  2877. program. Because I'm using recursion to do it, the space used by the stack
  2878. frames generated by each recursive function call adds up to a significant
  2879. portion of my memory use.
  2880.  
  2881.   Could anyone tell me what goes into a stack frame, so that I can try to
  2882. reduce the space it takes up? I'm using only 40bytes of locals vars and
  2883. parameters in each function, but watching the SP register increment after
  2884. each recursive call suggests that I'm using ~150bytes instead.
  2885.  
  2886.   I'm programming on a Powerbook 5300, if that helps, and the CW debugger
  2887. was on.
  2888.  
  2889. Thanks,
  2890. - Ian
  2891.  
  2892.  
  2893.  
  2894. +++++++++++++++++++++++++++
  2895.  
  2896. >From Edward de Jong <edward@magicmouse.com>
  2897. Date: 28 Nov 1995 20:59:14 GMT
  2898. Organization: magic mouse productions
  2899.  
  2900. Unfortunately the PowerPC code stack frame carries a lot of overhead 
  2901. (much more than the 68k stack frame), so perhaps you should consider an 
  2902. array, and not use a recursive solution.  Remember that recursion can 
  2903. always be emulated with loops.
  2904.  
  2905.  
  2906.  
  2907. +++++++++++++++++++++++++++
  2908.  
  2909. >From reinder@neuretp.biol.ruu.nl (Reinder Verlinde)
  2910. Date: Mon, 04 Dec 1995 20:43:05 +0100
  2911. Organization: Rijksuniversiteit Utrecht
  2912.  
  2913. In article <49caek$72f@jupiter.iti.gov.sg>, ianchan@iti.gov.sg wrote:
  2914.  
  2915. ) Hi,
  2916. )   I'm learning to program on a Mac, and am writing a maze-generator/solver
  2917. ) program. Because I'm using recursion to do it, the space used by the stack
  2918. ) frames generated by each recursive function call adds up to a significant
  2919. ) portion of my memory use.
  2920. )   Could anyone tell me what goes into a stack frame, so that I can try to
  2921. ) reduce the space it takes up? I'm using only 40bytes of locals vars and
  2922. ) parameters in each function, but watching the SP register increment after
  2923. ) each recursive call suggests that I'm using ~150bytes instead.
  2924. )   I'm programming on a Powerbook 5300, if that helps, and the CW debugger
  2925. ) was on.
  2926. )
  2927. The PowerMac runtime model eats stack for a living. I don't know the exact
  2928. details, but basically, the assumption is that half of the registers get
  2929. trashed in _any_  subroutine. Therefore, they are saved, not by the
  2930. callee, but by the caller. That probably are the ~150 bytes you loose.
  2931. Whether or not you actually need the local vars, you get them. There is
  2932. some reason for this. It is possibly related to pipelining, but it may
  2933. also be the observation that consecutive subroutine calls to 'leaf'
  2934. routines (i.e. routines which don't call other routines) would do extra
  2935. work if they were to save registers. The caller would not be so dumb to
  2936. restore, and then save registers. Anyway, for some reason the decision
  2937. was taken. Ask in the comp.powerpc.tech group for more info.
  2938. Disclaimer: I don't have a PowerMac (yet), so I'm not an expert.
  2939. The solution for your problem may be that you are better of writing the
  2940. program without recursion.
  2941.  
  2942. Reinder Verlinde
  2943.  
  2944. >From the index of Inside Macintosh:
  2945.    "Human interface Guidelines: see User interface Guidelines"
  2946. I wonder what they are aiming at. Monkeys? Aliens? Mice?
  2947.  
  2948. ---------------------------
  2949.  
  2950. >From greg@ohs.uwo.ca (Greg Chapman)
  2951. Subject: [Q] OpenTransport Introduction?
  2952. Date: Tue, 28 Nov 1995 16:25:12 -0500
  2953. Organization: U. of Western Ontario, OHS
  2954.  
  2955. Is there a good set of examples and/or documentation for programming
  2956. OpenTranport applications?
  2957.  
  2958. Cheers,
  2959.  
  2960. -- 
  2961. Greg Chapman - Mac Programmer/Developer
  2962. Systems Manager - U. of Western Ontario OHS
  2963. London, Ontario, Canada
  2964. email: greg@ohs.uwo.ca
  2965. - -
  2966. "... cleans teeth, while you do dishes!"
  2967.  
  2968. +++++++++++++++++++++++++++
  2969.  
  2970. >From hellyer@noc.tor.hookup.net (Roger Smith)
  2971. Date: Tue, 28 Nov 1995 22:01:50 -0500
  2972. Organization: Gold Disk
  2973.  
  2974. In article <greg-2811951625120001@mail.ohs.uwo.ca>, greg@ohs.uwo.ca (Greg
  2975. Chapman) wrote:
  2976.  
  2977. > Is there a good set of examples and/or documentation for programming
  2978. > OpenTranport applications?
  2979. > Cheers,
  2980. > -- 
  2981.  
  2982. For a good example on OT programming, download the NewsWathcher source
  2983. code. It uses OT if available and MacTcp otherwise.
  2984.  
  2985. > The anonymous FTP site for the program, the user document, and the
  2986. > CodeWarrior C source code is:
  2987. >    ftp://ftp.acns.nwu.edu/pub/newswatcher/
  2988.  
  2989.  
  2990. The following URL's were taken from a recent MacTech  Magazine:
  2991.  
  2992. OpenTransport/TCP gopher://seeding.apple.com
  2993.                     ftp://seeding.apple.com/ess/public/mactcp/MacTCP_Dev_Kit
  2994.                      http://pilot.nijin.net/~msproul/
  2995.  
  2996. Roger
  2997.  
  2998. -- 
  2999. - -
  3000. Roger Smith
  3001. Gold Disk Inc.
  3002. Internet:rogers@golddisk.com
  3003.  
  3004. +++++++++++++++++++++++++++
  3005.  
  3006. >From j-norstad@nwu.edu (John Norstad)
  3007. Date: Tue, 28 Nov 1995 22:21:31 -0600
  3008. Organization: Northwestern University
  3009.  
  3010. In article <greg-2811951625120001@mail.ohs.uwo.ca>, greg@ohs.uwo.ca (Greg
  3011. Chapman) wrote:
  3012.  
  3013. > Is there a good set of examples and/or documentation for programming
  3014. > OpenTranport applications?
  3015.  
  3016. Documentation:
  3017.  
  3018.     <ftp://seeding.apple.com/opentransport/OT_dev_info/>
  3019.  
  3020. One example, the source code for my NewsWatcher program:
  3021.  
  3022.     <ftp://ftp.acns.nwu.edu/pub/newswatcher/>
  3023.  
  3024. See the module "net.c", which contains all the Open Transport code.
  3025.  
  3026. -- 
  3027. John Norstad
  3028. Academic Technologies
  3029. Northwestern University
  3030. j-norstad@nwu.edu
  3031. <http://charlotte.acns.nwu.edu/jln/jln.html>
  3032.  
  3033. ---------------------------
  3034.  
  3035. >From buggysft@aimnet.com (Scott Dunbar)
  3036. Subject: [Q] Using Update Events
  3037. Date: Fri, 10 Nov 1995 19:44:04 -0800
  3038. Organization: BuggySoft Development
  3039.  
  3040. What's the correct or "standard" way of using handling an update event? I
  3041. tried to use the following code, but when it gets an update event in the
  3042. background it will draw the picture over any windows in the way which
  3043. causes quite a mess!
  3044. Here's my code:
  3045.  
  3046. updateEvt: 
  3047.     begin
  3048.      BeginUpdate(WindowPtr(gEvent.message));
  3049.      if (WindowPtr(gEvent.message)) = gWindow then {make sure it's my window}
  3050.       CopyBits(offscreen^.portbits,
  3051. gWindow^.portbits,offscreen^.portRect,gWindow^.portRect, srcCopy, nil); 
  3052. {copy the pict from my offscreen to my window}
  3053.      EndUpdate(WindowPtr(gEvent.message));
  3054.     end;
  3055.  
  3056. Thanks for any help at all!
  3057.  
  3058. - -
  3059. - Scott Dunbar
  3060. - BuggySoft™ Development
  3061. - buggysft@aimnet.com
  3062. - IRC:  Poot
  3063. - http://users.aimnet.com/~buggysft/
  3064. - ftp://ftp.aimnet.com/pub/users/buggysft/
  3065.  
  3066. +++++++++++++++++++++++++++
  3067.  
  3068. >From ola.berg@digit.se (Ola Berg)
  3069. Date: 11 Nov 1995 22:06:43 GMT
  3070. Organization: Digit
  3071.  
  3072. Scott Dunbar,buggysft@aimnet.com,Internet wrote:
  3073.  
  3074. >What's the correct or "standard" way of using handling an update event?
  3075.  
  3076. If this is standard? I dunno. But it works fine! :-)
  3077.  
  3078. void HandleUpdate( WindowPtr win)
  3079.     {
  3080.     GrafPort old; // needed for restoring 
  3081.     
  3082.     GetPort( &old); // saves the current grafport
  3083.     SetPort( win); // steers the drawing to the right win. This was your
  3084. probl.
  3085.     BeginUpdate( win); // tell EventMgr that the event is about to be handled
  3086.     MyDoDraw( win); // draws the contents
  3087.     EndUpdate( win); // Aah, updating ready!
  3088.     SetPort( old); // steers drawing back to the appropriate grafport
  3089.     }
  3090.  
  3091. BLSU!
  3092.  
  3093. <ichtys><
  3094. Ola
  3095.  
  3096. +++++++++++++++++++++++++++
  3097.  
  3098. >From ingemar@lysator.liu.se (Ingemar Ragnemalm)
  3099. Date: 13 Nov 1995 19:51:05 GMT
  3100. Organization: (none)
  3101.  
  3102. buggysft@aimnet.com (Scott Dunbar) writes:
  3103.  
  3104. >What's the correct or "standard" way of using handling an update event? I
  3105. >tried to use the following code, but when it gets an update event in the
  3106. >background it will draw the picture over any windows in the way which
  3107. >causes quite a mess!
  3108.  
  3109. >updateEvt: 
  3110. >    begin
  3111. >     BeginUpdate(WindowPtr(gEvent.message));
  3112. >     if (WindowPtr(gEvent.message)) = gWindow then {make sure it's my window}
  3113. >      CopyBits(offscreen^.portbits,
  3114. >gWindow^.portbits,offscreen^.portRect,gWindow^.portRect, srcCopy, nil); 
  3115. >{copy the pict from my offscreen to my window}
  3116. >     EndUpdate(WindowPtr(gEvent.message));
  3117. >    end;
  3118.  
  3119. I would SetPort to gWindow before CopyBitsing. Otherwise it looks ok.
  3120.  
  3121. --
  3122. - -
  3123. Ingemar Ragnemalm, PhD
  3124. Image processing, Mac shareware games
  3125. E-mail address: ingemar@isy.liu.se or ingemar@lysator.liu.se
  3126.  
  3127. +++++++++++++++++++++++++++
  3128.  
  3129. >From wuttke@stein.teuto.de (M. Wuttke)
  3130. Date: Mon, 13 Nov 1995 20:49:18 +0100
  3131. Organization: -
  3132.  
  3133. > What's the correct or "standard" way of using handling an update event? I
  3134. > tried to use the following code, but when it gets an update event in the
  3135. > background it will draw the picture over any windows in the way which
  3136. > causes quite a mess!
  3137. > Here's my code:
  3138. > updateEvt: 
  3139. >     begin
  3140. >      BeginUpdate(WindowPtr(gEvent.message));
  3141. >      if (WindowPtr(gEvent.message)) = gWindow then {make sure it's my window}
  3142. >       CopyBits(offscreen^.portbits,
  3143. > gWindow^.portbits,offscreen^.portRect,gWindow^.portRect, srcCopy, nil); 
  3144. > {copy the pict from my offscreen to my window}
  3145. >      EndUpdate(WindowPtr(gEvent.message));
  3146. >     end;
  3147.  
  3148. Try calling
  3149.  
  3150. SetPort(WindowPtr(gEvent.message));
  3151.  
  3152. before drawing to the window.
  3153.  
  3154. Matthias
  3155.  
  3156. .....................................................................
  3157. Manfred & Matthias Wuttke             E-Mail: wuttke@stein.teuto.de
  3158. Hilterweg 14                          Phone:  +49 (0) 5204-8502
  3159. D-33803 Steinhagen
  3160. Germany
  3161. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3162.  
  3163. +++++++++++++++++++++++++++
  3164.  
  3165. >From z044304 (James Derrick)
  3166. Date: Tue, 14 Nov 1995 07:30:13 +0800
  3167. Organization: The Chinese University of Hong Kong
  3168.  
  3169. In article <buggysft-1011951944040001@dial-bp1-28.iway.aimnet.com>,
  3170. buggysft@aimnet.com (Scott Dunbar) wrote:
  3171.  
  3172. > What's the correct or "standard" way of using handling an update event? I
  3173. > tried to use the following code, but when it gets an update event in the
  3174. > background it will draw the picture over any windows in the way which
  3175. > causes quite a mess!
  3176.  
  3177. [ code snipped to pacify mailer]
  3178.  
  3179.  
  3180. You need to call SetPort, or SetGWorld before you do the CopyBits.
  3181.  
  3182. -- 
  3183. James Derrick
  3184.  
  3185. +++++++++++++++++++++++++++
  3186.  
  3187. >From dick.moyer@trw.com (Richard Moyer)
  3188. Date: Tue, 14 Nov 1995 14:53:07 -0800
  3189. Organization: TRW
  3190.  
  3191. In article <buggysft-1011951944040001@dial-bp1-28.iway.aimnet.com>,
  3192. buggysft@aimnet.com (Scott Dunbar) wrote:
  3193.  
  3194. > What's the correct or "standard" way of using handling an update event? I
  3195. > tried to use the following code, but when it gets an update event in the
  3196. > background it will draw the picture over any windows in the way which
  3197. > causes quite a mess!
  3198. > Here's my code:
  3199. > updateEvt: 
  3200. >     begin
  3201. >      BeginUpdate(WindowPtr(gEvent.message));
  3202. >      if (WindowPtr(gEvent.message)) = gWindow then {make sure it's my window}
  3203. >       CopyBits(offscreen^.portbits,
  3204. > gWindow^.portbits,offscreen^.portRect,gWindow^.portRect, srcCopy, nil); 
  3205. > {copy the pict from my offscreen to my window}
  3206. >      EndUpdate(WindowPtr(gEvent.message));
  3207. >     end;
  3208. > Thanks for any help at all!
  3209. Even though the event is in your window, that doesn't mean your window is
  3210. the current port. SetPort to gWindow and try again.
  3211.  
  3212. -- 
  3213. Dick Moyer, TRW
  3214. (310) 813-9549
  3215.  
  3216. +++++++++++++++++++++++++++
  3217.  
  3218. >From <louisbel@worldnet.net>
  3219. Date: 15 Nov 1995 07:57:21 GMT
  3220. Organization: World-Net information exchange, Internet provider.
  3221.  
  3222. > updateEvt:
  3223. >     begin
  3224. >      BeginUpdate(WindowPtr(gEvent.message));
  3225. >      if (WindowPtr(gEvent.message)) = gWindow then {make sure it's my window}
  3226. >       CopyBits(offscreen^.portbits,
  3227. > gWindow^.portbits,offscreen^.portRect,gWindow^.portRect, srcCopy, nil);
  3228. > {copy the pict from my offscreen to my window}
  3229. >      EndUpdate(WindowPtr(gEvent.message));
  3230. >     end;
  3231.  
  3232. Try this :
  3233.                 BEGIN
  3234.                         Getport(oldPort);
  3235.                         BeginUpdate();
  3236.                         SetPort(gWindow);
  3237.                         ......
  3238.                         EndUpdate();
  3239.                         SetPort(oldPort);
  3240.  
  3241.  
  3242. Have fun !                      
  3243.  
  3244.  
  3245.  
  3246. +++++++++++++++++++++++++++
  3247.  
  3248. >From clutzer@gpu.srv.ualberta.ca (Christiaan Lutzer)
  3249. Date: Thu, 23 Nov 1995 19:15:05 -0700
  3250. Organization: University of Alberta
  3251.  
  3252. In article <buggysft-1011951944040001@dial-bp1-28.iway.aimnet.com>,
  3253. buggysft@aimnet.com (Scott Dunbar) wrote:
  3254.  
  3255. > What's the correct or "standard" way of using handling an update event? I
  3256. > tried to use the following code, but when it gets an update event in the
  3257. > background it will draw the picture over any windows in the way which
  3258. > causes quite a mess!
  3259. > Here's my code:
  3260. > updateEvt: 
  3261. >     begin
  3262. >      BeginUpdate(WindowPtr(gEvent.message));
  3263. >      if (WindowPtr(gEvent.message)) = gWindow then {make sure it's my window}
  3264. >       CopyBits(offscreen^.portbits,
  3265. > gWindow^.portbits,offscreen^.portRect,gWindow^.portRect, srcCopy, nil); 
  3266. > {copy the pict from my offscreen to my window}
  3267. >      EndUpdate(WindowPtr(gEvent.message));
  3268. >     end;
  3269. > Thanks for any help at all!
  3270. > ---
  3271. > - Scott Dunbar
  3272. > - BuggySoft™ Development
  3273. > - buggysft@aimnet.com
  3274. > - IRC:  Poot
  3275. > - http://users.aimnet.com/~buggysft/
  3276. > - ftp://ftp.aimnet.com/pub/users/buggysft/
  3277.  
  3278. You might want to try clipping the drawing region of your windows grafPort
  3279. to the "visRgn" using SetClip(gWindow^.visRgn); This will allow drawing in
  3280. only the visible region of the current grafPort. (which you will most
  3281. likely have set to gWindow)
  3282.  
  3283. Hope that works.  Later
  3284.  
  3285. +++++++++++++++++++++++++++
  3286.  
  3287. >From cameron_esfahani@powertalk.apple.com (Cameron Esfahani)
  3288. Date: Thu, 23 Nov 1995 19:09:17 -0800
  3289. Organization: Apple Computer, Inc.
  3290.  
  3291. Actually, just doing:
  3292.    updateEvt: 
  3293.       begin
  3294.          BeginUpdate(WindowPtr(gEvent.message));
  3295.             if (WindowPtr(gEvent.message)) = gWindow then
  3296.                begin
  3297.                   GetPort(oldPort);
  3298.                   SetPort(GrafPtr(gEvent.message));
  3299.                   CopyBits(offscreen^.portBits,
  3300. gWindow^.portBits,                  offscreen^.portRect,
  3301. gWindow^.portRect, srcCopy, nil);
  3302.                   SetPort(oldPort);
  3303.               end;
  3304.           EndUpdate(WindowPtr(gEvent.message));
  3305.       end;
  3306.  
  3307. By doing the SetPort, Quickdraw will use the current ports clip/vis rgns
  3308. in doing the calculation of exactly what area of your window can be
  3309. overwritten.  It is also always a good habit to get into to save and
  3310. restore the current port whenever you change it.
  3311.  
  3312. Hope this helps you out,
  3313. Cameron Esfahani
  3314.  
  3315.  
  3316. In article <clutzer-2311951915050001@async9-15.remote.ualberta.ca>,
  3317. clutzer@gpu.srv.ualberta.ca (Christiaan Lutzer) wrote:
  3318.  
  3319. > In article <buggysft-1011951944040001@dial-bp1-28.iway.aimnet.com>,
  3320. > buggysft@aimnet.com (Scott Dunbar) wrote:
  3321. > > What's the correct or "standard" way of using handling an update event? I
  3322. > > tried to use the following code, but when it gets an update event in the
  3323. > > background it will draw the picture over any windows in the way which
  3324. > > causes quite a mess!
  3325. > > Here's my code:
  3326. > > 
  3327. > > updateEvt: 
  3328. > >     begin
  3329. > >      BeginUpdate(WindowPtr(gEvent.message));
  3330. > >      if (WindowPtr(gEvent.message)) = gWindow then {make sure it's my
  3331. window}
  3332. > >       CopyBits(offscreen^.portbits,
  3333. > > gWindow^.portbits,offscreen^.portRect,gWindow^.portRect, srcCopy, nil); 
  3334. > > {copy the pict from my offscreen to my window}
  3335. > >      EndUpdate(WindowPtr(gEvent.message));
  3336. > >     end;
  3337. > > 
  3338. > > Thanks for any help at all!
  3339. > > 
  3340. > > ---
  3341. > > - Scott Dunbar
  3342. > > - BuggySoft™ Development
  3343. > > - buggysft@aimnet.com
  3344. > > - IRC:  Poot
  3345. > > - http://users.aimnet.com/~buggysft/
  3346. > > - ftp://ftp.aimnet.com/pub/users/buggysft/
  3347. > You might want to try clipping the drawing region of your windows grafPort
  3348. > to the "visRgn" using SetClip(gWindow^.visRgn); This will allow drawing in
  3349. > only the visible region of the current grafPort. (which you will most
  3350. > likely have set to gWindow)
  3351. > Hope that works.  Later
  3352.  
  3353. +++++++++++++++++++++++++++
  3354.  
  3355. >From tim@dierks.org (Tim Dierks)
  3356. Date: Sat, 25 Nov 1995 17:56:44 -0800
  3357. Organization: Stinky Cheese Man Fan Club
  3358.  
  3359. In article <buggysft-1011951944040001@dial-bp1-28.iway.aimnet.com>,
  3360. buggysft@aimnet.com (Scott Dunbar) wrote:
  3361.  
  3362. > What's the correct or "standard" way of using handling an update event? I
  3363. > tried to use the following code, but when it gets an update event in the
  3364. > background it will draw the picture over any windows in the way which
  3365. > causes quite a mess!
  3366. > Here's my code:
  3367. > updateEvt: 
  3368. >     begin
  3369. >      BeginUpdate(WindowPtr(gEvent.message));
  3370. >      if (WindowPtr(gEvent.message)) = gWindow then {make sure it's my window}
  3371. >       CopyBits(offscreen^.portbits,
  3372. > gWindow^.portbits,offscreen^.portRect,gWindow^.portRect, srcCopy, nil); 
  3373. > {copy the pict from my offscreen to my window}
  3374. >      EndUpdate(WindowPtr(gEvent.message));
  3375. >     end;
  3376. > Thanks for any help at all!
  3377.  
  3378. Call SetPort(gWindow); to set the drawing port to your window so QuickDraw
  3379. will do all the appropriate clipping.
  3380.  
  3381. Best,
  3382.  - Tim
  3383.  
  3384. -- 
  3385. Tim Dierks - Software Haruspex - tim@dierks.org
  3386. If you can't lick 'em, stick 'em on with a big piece of tape. - Negativland
  3387.  
  3388. +++++++++++++++++++++++++++
  3389.  
  3390. >From Bridget Hardcastle <bmh@ee.ic.ac.uk>
  3391. Date: 28 Nov 1995 14:44:24 GMT
  3392. Organization: Imperial College (EEE)
  3393.  
  3394. Aha! The bits of code that
  3395.  
  3396. >buggysft@aimnet.com (Scott Dunbar) wrote:
  3397.  
  3398. i.e.
  3399.  
  3400. >> updateEvt: 
  3401. >>     begin
  3402. >>      BeginUpdate(WindowPtr(gEvent.message));
  3403. >>      if (WindowPtr(gEvent.message)) = gWindow then {make sure it's my window}
  3404. >>       CopyBits(offscreen^.portbits,
  3405. >> gWindow^.portbits,offscreen^.portRect,gWindow^.portRect, srcCopy, nil); 
  3406. >> {copy the pict from my offscreen to my window}
  3407. >>      EndUpdate(WindowPtr(gEvent.message));
  3408. >>     end;
  3409.  
  3410. look like the sort of thing I've been looking for for days!
  3411.  
  3412. My situation is that I'm obliged to write a program using a package that calls
  3413. itself Turbo 1.1, on a Macintosh SE/30. I'm learning Pascal from scratch 
  3414. and the only manuals at college are for Pascal on an IBM PC.
  3415.  
  3416. My problem is that I cannot find the commands I need to use to put text (etc)
  3417. windows on the Mac; where can I find them? Are they listed somewhere 
  3418. electronically? Do I have to look for a secondhand manual somewhere? I've 
  3419. already checked out the college library.
  3420.  
  3421. Apologies for the amateurishness of this post; I'm trying...
  3422. Any help gratefully received, posted or emailed.
  3423.  
  3424. Bridget Hardcastle
  3425.  
  3426.  
  3427. +++++++++++++++++++++++++++
  3428.  
  3429. >From catambay#m#bill@mmac.is.lmsc.lockheed.com (Bill the Cat)
  3430. Date: 30 Nov 1995 16:04:12 GMT
  3431. Organization: MacPascal Mailing List
  3432.  
  3433. In article <49f788$6n1@oban.cc.ic.ac.uk>, Bridget Hardcastle
  3434. <bmh@ee.ic.ac.uk> wrote:
  3435.  
  3436. > My problem is that I cannot find the commands I need to use to put text (etc)
  3437. > windows on the Mac; where can I find them? Are they listed somewhere 
  3438. > electronically? Do I have to look for a secondhand manual somewhere? I've 
  3439. > already checked out the college library.
  3440.  
  3441. For basic window handling, check out Inside Mac: Toolbox Essentials.  You
  3442. can get a free copy of it online at the following ftp site:
  3443.  
  3444. ftp://ftp.info.apple.com/Apple.Support.Area/Developer_Services/
  3445.     Technical_Documentation/Inside_Macintosh/
  3446.  
  3447. Good luck!
  3448.  
  3449. _____________________________________________________________________
  3450. Bill Catambay
  3451. Pascal Programmer on Macintosh and Open VMS
  3452.  
  3453.               />
  3454.              //   The purpose of software engineering  
  3455.      (//////[O]>=========================================-
  3456.              \\    is to manage complexity, not to create it.
  3457.               \>
  3458.  
  3459. ____________________________________________________________________
  3460.         
  3461.  
  3462. ---------------------------
  3463.  
  3464. End of C.S.M.P. Digest
  3465. **********************
  3466.